SELECT d,
sum(CASE WHEN LW = 'Green' THEN cnt ELSE 0 END) [Green],
sum(CASE WHEN LW = 'Non-Green' THEN cnt ELSE 0 END) [Non-Green]
FROM
(
SELECT [date] AS d,
[Type] as LW,
CASE WHEN Value1 >= 10 THEN 1 ELSE 0 END +
CASE WHEN Value2 >= 10 THEN 1 ELSE 0 END +
CASE WHEN Value3 >= 10 THEN 1 ELSE 0 END AS cnt,
DENSE_RANK() over (ORDER BY [date] DESC) dr
FROM tbBooth
WHERE Type in ('Green','Non-Green')
) x
WHERE dr < 8
GROUP BY d
ORDER BY d ASC
SQL Server : how to combine two select queries from the same table and take the result on Column
-
11-07-2023 - |
Question
I want to combine two queries on the same table that has group by.
Here is my table :
Date##### | Value1 | Value2 | Value3 | Type
------------------------------------------------------
23/04/2014 | 1,2 | 12,3 | 10 | Green
23/04/2014 | 11,2 | 3 | 10,3 | Non-Green
24/04/2014 | 10,9 | 3 | 11 | Green
24/04/2014 | 2,3 | 12,3 | 8 | Green
24/04/2014 | 10 | 1 | 11 | Non-Green
25/04/2014 | 10 | 2 | 10,8 | Non-Green
25/04/2014 | 1,4 | 5 | 12 | Green
The values are of Decimal
type. Count the value1, value2, value3 >= 10. the expected result:
Date##### | Green |Non-Green
------------------------------
23/04/2014 | 2 | 2
24/04/2014 | 3 | 2
25/04/2014 | 1 | 2
The value on green and non-green was from counting >= 10 of value1, value2, value3, here is my first query :
Dim strCommand As String = "SELECT d, LW, cnt FROM(SELECT TOP 7 [date] AS d, [Type] as LW, SUM(CASE WHEN Value1 >= 10 THEN 1 ELSE 0 END + CASE WHEN Value2 >= 10 THEN 1 ELSE 0 END + CASE WHEN Value3 >= 10 THEN 1 ELSE 0 END) AS cnt FROM tbBooth where Type = 'Green' GROUP BY [date],[Type] ORDER BY [date] DESC) x ORDER BY d ASC"
It display :
Date##### | Cnt |Type
------------------------
23/04/2014 | 2 | Green
24/04/2014 | 3 | Green
25/04/2014 | 1 | Green
My second query :
Dim strCommand As String = "SELECT d, LW, cnt FROM(SELECT TOP 7 [date] AS d, [Type] as LW, SUM(CASE WHEN Value1 >= 10 THEN 1 ELSE 0 END + CASE WHEN Value2 >= 10 THEN 1 ELSE 0 END + CASE WHEN Value3 >= 10 THEN 1 ELSE 0 END) AS cnt FROM tbBooth where Type = 'Non-Green' GROUP BY [date],[Type] ORDER BY [date] DESC) x ORDER BY d ASC"
It display :
Date##### | Cnt |Type
------------------------
23/04/2014 | 2 | Non-Green
24/04/2014 | 2 | Non-Green
25/04/2014 | 2 | Non-Green
I want to combine both query to become one, and take the date, result of green and result of non-green. Assume that I have a lot of group of date, I want it to display only the last 7 group of date based on ASC
order.
Is there anyway how to do it? I tried to look on other SO post, like using UNION or PIVOT but I don't have any clue how to implement it on my code.
Sorry, I already post this question yesterday, this is an edit with the expected result....
Thanks in advance....
Solution
OTHER TIPS
You could use two case statements, one for each value; here I'm splitting the rows up in a common table expression first to simplify the cases somewhat;
WITH cte AS (
SELECT date, type, value1 value FROM tbBooth UNION ALL
SELECT date, type, value2 value FROM tbBooth UNION ALL
SELECT date, type, value3 value FROM tbBooth
)
SELECT date d,
SUM(CASE WHEN type='Green' AND value>=10.0 THEN 1 ELSE 0 END) Green,
SUM(CASE WHEN type='Non-Green' AND value>=10.0 THEN 1 ELSE 0 END) NonGreen
FROM cte
GROUP BY [date]
ORDER BY [date] DESC
try this one query instead of case when for every column...
Select *
From (
Select [Date], [Type], COUNT(*) Cnt
From tbBooth
UnPivot (Value For Name In ([Value1],[Value2],[Value3])) As UnPvt
Where Value >= 10
Group By [Date], [Type]
) As GrpBooth
Pivot (SUM(Cnt) For Type IN ([Green],[Non-Green])) As Pvt
and out put is :
Date Green Non-Green
----------------------- ----------- -----------
2014-04-23 00:00:00.000 2 2
2014-04-24 00:00:00.000 3 2
2014-04-25 00:00:00.000 1 2
I have tried to get your required output. Please check it out.
Please let me know if I have missed anything here so that I can correct it.
--Simulated your table
DECLARE @tbl TABLE
(
[DATE] DATETIME,
Value1 FLOAT,
Value2 FLOAT,
Value3 FLOAT,
[Type] VARCHAR(50)
)
--Entered values for testing
INSERT INTO @tbl([DATE], VALUE1, VALUE2, VALUE3, [TYPE]) VALUES('04/23/2014','1.2','12.3 ','10','Green')
INSERT INTO @tbl([DATE], VALUE1, VALUE2, VALUE3, [TYPE]) VALUES('04/23/2014','11.2','3','10.3','Non-Green')
INSERT INTO @tbl([DATE], VALUE1, VALUE2, VALUE3, [TYPE]) VALUES('04/24/2014','10.9','3','11','Green')
INSERT INTO @tbl([DATE], VALUE1, VALUE2, VALUE3, [TYPE]) VALUES('04/24/2014','2.3','12.3 ','8','Green')
INSERT INTO @tbl([DATE], VALUE1, VALUE2, VALUE3, [TYPE]) VALUES('04/24/2014','10','1','11','Non-Green')
INSERT INTO @tbl([DATE], VALUE1, VALUE2, VALUE3, [TYPE]) VALUES('04/25/2014','10','2','10.8','Non-Green')
INSERT INTO @tbl([DATE], VALUE1, VALUE2, VALUE3, [TYPE]) VALUES('04/25/2014','1.4','5','12','Green')
--your required query
SELECT TOP 7 * FROM
(
SELECT [date] AS d,
SUM(CASE WHEN [Type] = 'Green' AND Value1 >= 10 THEN 1 ELSE 0 END + CASE WHEN [Type] = 'Green' AND Value2 >= 10 THEN 1 ELSE 0 END + CASE WHEN [Type] = 'Green' AND Value3 >= 10 THEN 1 ELSE 0 END) AS Green,
SUM(CASE WHEN [Type] = 'Non-Green' AND Value1 >= 10 THEN 1 ELSE 0 END + CASE WHEN [Type] = 'Non-Green' AND Value2 >= 10 THEN 1 ELSE 0 END + CASE WHEN [Type] = 'Non-Green' AND Value3 >= 10 THEN 1 ELSE 0 END) AS [Non-Green]
FROM @tbl
GROUP BY [date]
)x
ORDER BY d ASC
Hope this helps