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....

Was it helpful?

Solution

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

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

An SQLfiddle to test with.

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

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top