Author |
Topic |
gauravkanand
Starting Member
5 Posts |
Posted - 2012-08-06 : 07:35:46
|
I am new to SQL.. I need some help in writing a querysample data in table ID STATUS DATE1 UP 10/07/2012 2 DOWN 12/07/20123 UP 15/07/20124 UP 14/08/20125 DOWN 10/08/20126 DOWN 10/09/20127 UP 10/10/20128 UP 12/10/2012As my output i needtotal no of id's in each month with status as UP & DOWN and their net difference too ie. Up is +1 & Down is -1 JULY AUGUST SEPTEMBER OCTUP 2 1 0 2DOWN 1 1 1 0TOTAL 1 0 -1 2 NET 1 1 0 2TOTAL IS being caluclated as (UP - DOWN) for particular month and NET is calculated as for JULY (UP - DOWN) gives (2-1) = 1then we add this to total of AUG (1 + 0 ) = 1 and then the Aug net is added to total of sept to get the net of sept (1 -1) = 0and similarly for oct (0+2) = 2.Two seprate queries for calcuating Total and Net are also acceptable.Thanks! in advance |
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2012-08-06 : 08:39:58
|
[code]-- Prepare sample dataDECLARE @Sample TABLE ( ID INT NOT NULL, [STATUS] VARCHAR(20) NOT NULL, [DATE] DATE NOT NULL );-- Populate sample dataINSERT @Sample ( ID, [STATUS], [DATE] )VALUES (1, 'UP', '20120710'), (2, 'DOWN', '20120712'), (3, 'UP', '20120715'), (4, 'UP', '20120814'), (5, 'DOWN', '20120810'), (6, 'DOWN', '20120910'), (7, 'UP', '20121010'), (8, 'UP', '20121012');-- Solution by SwePesoCREATE TABLE #Stage ( [Status] VARCHAR(20) NOT NULL, Value INT NOT NULL, [Month] TINYINT NOT NULL );INSERT #Stage ( [Status], Value, [Month] )SELECT [STATUS], SUM(CASE [STATUS] WHEN 'UP' THEN 1 ELSE -1 END) AS Value, DATEPART(MONTH, [DATE]) AS [Month]FROM @SampleWHERE [STATUS] IN ('UP', 'DOWN')GROUP BY [STATUS], DATEPART(MONTH, [DATE])CREATE NONCLUSTERED INDEX IX_Month ON #Stage ([Month]);WITH cteSource(theOrder, [Status], January, February, March, April, May, June, July, August, September, October, November, December)AS ( SELECT CASE [Status] WHEN 'UP' THEN 1 ELSE 2 END AS theOrder, [Status], SUM(CASE WHEN [Month] = 1 THEN ABS(Value) ELSE 0 END) AS January, SUM(CASE WHEN [Month] = 2 THEN ABS(Value) ELSE 0 END) AS February, SUM(CASE WHEN [Month] = 3 THEN ABS(Value) ELSE 0 END) AS March, SUM(CASE WHEN [Month] = 4 THEN ABS(Value) ELSE 0 END) AS April, SUM(CASE WHEN [Month] = 5 THEN ABS(Value) ELSE 0 END) AS May, SUM(CASE WHEN [Month] = 6 THEN ABS(Value) ELSE 0 END) AS June, SUM(CASE WHEN [Month] = 7 THEN ABS(Value) ELSE 0 END) AS July, SUM(CASE WHEN [Month] = 8 THEN ABS(Value) ELSE 0 END) AS August, SUM(CASE WHEN [Month] = 9 THEN ABS(Value) ELSE 0 END) AS September, SUM(CASE WHEN [Month] = 10 THEN ABS(Value) ELSE 0 END) AS October, SUM(CASE WHEN [Month] = 11 THEN ABS(Value) ELSE 0 END) AS November, SUM(CASE WHEN [Month] = 12 THEN ABS(Value) ELSE 0 END) AS December FROM #Stage GROUP BY [Status] UNION ALL SELECT 3 AS theOrder, 'Total' AS [Status], SUM(CASE WHEN [Month] = 1 THEN Value ELSE 0 END) AS January, SUM(CASE WHEN [Month] = 2 THEN Value ELSE 0 END) AS February, SUM(CASE WHEN [Month] = 3 THEN Value ELSE 0 END) AS March, SUM(CASE WHEN [Month] = 4 THEN Value ELSE 0 END) AS April, SUM(CASE WHEN [Month] = 5 THEN Value ELSE 0 END) AS May, SUM(CASE WHEN [Month] = 6 THEN Value ELSE 0 END) AS June, SUM(CASE WHEN [Month] = 7 THEN Value ELSE 0 END) AS July, SUM(CASE WHEN [Month] = 8 THEN Value ELSE 0 END) AS August, SUM(CASE WHEN [Month] = 9 THEN Value ELSE 0 END) AS September, SUM(CASE WHEN [Month] = 10 THEN Value ELSE 0 END) AS October, SUM(CASE WHEN [Month] = 11 THEN Value ELSE 0 END) AS November, SUM(CASE WHEN [Month] = 12 THEN Value ELSE 0 END) AS December FROM #Stage UNION ALL SELECT 4 AS theOrder, 'Net' AS [Status], SUM(CASE WHEN [Month] = 1 THEN Value ELSE 0 END) AS January, SUM(CASE WHEN [Month] = 2 THEN Value ELSE 0 END) AS February, SUM(CASE WHEN [Month] = 3 THEN Value ELSE 0 END) AS March, SUM(CASE WHEN [Month] = 4 THEN Value ELSE 0 END) AS April, SUM(CASE WHEN [Month] = 5 THEN Value ELSE 0 END) AS May, SUM(CASE WHEN [Month] = 6 THEN Value ELSE 0 END) AS June, SUM(CASE WHEN [Month] = 7 THEN Value ELSE 0 END) AS July, SUM(CASE WHEN [Month] = 8 THEN Value ELSE 0 END) AS August, SUM(CASE WHEN [Month] = 9 THEN Value ELSE 0 END) AS September, SUM(CASE WHEN [Month] = 10 THEN Value ELSE 0 END) AS October, SUM(CASE WHEN [Month] = 11 THEN Value ELSE 0 END) AS November, SUM(CASE WHEN [Month] = 12 THEN Value ELSE 0 END) AS December FROM ( SELECT s.[Month], f.Value FROM ( VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12) ) AS s([Month]) CROSS APPLY ( SELECT SUM(x.Value) FROM #Stage AS x WHERE x.[Month] <= s.[Month] ) AS f(Value) ) AS d)SELECT [Status], January, February, March, April, May, June, July, August, September, October, November, DecemberFROM cteSourceORDER BY theOrderDROP TABLE #Stage;[/code] N 56°04'39.26"E 12°55'05.63" |
 |
|
gauravkanand
Starting Member
5 Posts |
Posted - 2012-08-06 : 09:12:26
|
Thanks! for the quick reply.. though it will take some time for me to understand and implement this.I hope this will work.. I case of any issues i'll surely bug you |
 |
|
gauravkanand
Starting Member
5 Posts |
Posted - 2012-08-08 : 05:59:03
|
quote: Originally posted by SwePeso
-- Prepare sample dataDECLARE @Sample TABLE ( ID INT NOT NULL, [STATUS] VARCHAR(20) NOT NULL, [DATE] DATE NOT NULL );-- Populate sample dataINSERT @Sample ( ID, [STATUS], [DATE] )VALUES (1, 'UP', '20120710'), (2, 'DOWN', '20120712'), (3, 'UP', '20120715'), (4, 'UP', '20120814'), (5, 'DOWN', '20120810'), (6, 'DOWN', '20120910'), (7, 'UP', '20121010'), (8, 'UP', '20121012');-- Solution by SwePesoCREATE TABLE #Stage ( [Status] VARCHAR(20) NOT NULL, Value INT NOT NULL, [Month] TINYINT NOT NULL );INSERT #Stage ( [Status], Value, [Month] )SELECT [STATUS], SUM(CASE [STATUS] WHEN 'UP' THEN 1 ELSE -1 END) AS Value, DATEPART(MONTH, [DATE]) AS [Month]FROM @SampleWHERE [STATUS] IN ('UP', 'DOWN')GROUP BY [STATUS], DATEPART(MONTH, [DATE])CREATE NONCLUSTERED INDEX IX_Month ON #Stage ([Month]);WITH cteSource(theOrder, [Status], January, February, March, April, May, June, July, August, September, October, November, December)AS ( SELECT CASE [Status] WHEN 'UP' THEN 1 ELSE 2 END AS theOrder, [Status], SUM(CASE WHEN [Month] = 1 THEN ABS(Value) ELSE 0 END) AS January, SUM(CASE WHEN [Month] = 2 THEN ABS(Value) ELSE 0 END) AS February, SUM(CASE WHEN [Month] = 3 THEN ABS(Value) ELSE 0 END) AS March, SUM(CASE WHEN [Month] = 4 THEN ABS(Value) ELSE 0 END) AS April, SUM(CASE WHEN [Month] = 5 THEN ABS(Value) ELSE 0 END) AS May, SUM(CASE WHEN [Month] = 6 THEN ABS(Value) ELSE 0 END) AS June, SUM(CASE WHEN [Month] = 7 THEN ABS(Value) ELSE 0 END) AS July, SUM(CASE WHEN [Month] = 8 THEN ABS(Value) ELSE 0 END) AS August, SUM(CASE WHEN [Month] = 9 THEN ABS(Value) ELSE 0 END) AS September, SUM(CASE WHEN [Month] = 10 THEN ABS(Value) ELSE 0 END) AS October, SUM(CASE WHEN [Month] = 11 THEN ABS(Value) ELSE 0 END) AS November, SUM(CASE WHEN [Month] = 12 THEN ABS(Value) ELSE 0 END) AS December FROM #Stage GROUP BY [Status] UNION ALL SELECT 3 AS theOrder, 'Total' AS [Status], SUM(CASE WHEN [Month] = 1 THEN Value ELSE 0 END) AS January, SUM(CASE WHEN [Month] = 2 THEN Value ELSE 0 END) AS February, SUM(CASE WHEN [Month] = 3 THEN Value ELSE 0 END) AS March, SUM(CASE WHEN [Month] = 4 THEN Value ELSE 0 END) AS April, SUM(CASE WHEN [Month] = 5 THEN Value ELSE 0 END) AS May, SUM(CASE WHEN [Month] = 6 THEN Value ELSE 0 END) AS June, SUM(CASE WHEN [Month] = 7 THEN Value ELSE 0 END) AS July, SUM(CASE WHEN [Month] = 8 THEN Value ELSE 0 END) AS August, SUM(CASE WHEN [Month] = 9 THEN Value ELSE 0 END) AS September, SUM(CASE WHEN [Month] = 10 THEN Value ELSE 0 END) AS October, SUM(CASE WHEN [Month] = 11 THEN Value ELSE 0 END) AS November, SUM(CASE WHEN [Month] = 12 THEN Value ELSE 0 END) AS December FROM #Stage UNION ALL SELECT 4 AS theOrder, 'Net' AS [Status], SUM(CASE WHEN [Month] = 1 THEN Value ELSE 0 END) AS January, SUM(CASE WHEN [Month] = 2 THEN Value ELSE 0 END) AS February, SUM(CASE WHEN [Month] = 3 THEN Value ELSE 0 END) AS March, SUM(CASE WHEN [Month] = 4 THEN Value ELSE 0 END) AS April, SUM(CASE WHEN [Month] = 5 THEN Value ELSE 0 END) AS May, SUM(CASE WHEN [Month] = 6 THEN Value ELSE 0 END) AS June, SUM(CASE WHEN [Month] = 7 THEN Value ELSE 0 END) AS July, SUM(CASE WHEN [Month] = 8 THEN Value ELSE 0 END) AS August, SUM(CASE WHEN [Month] = 9 THEN Value ELSE 0 END) AS September, SUM(CASE WHEN [Month] = 10 THEN Value ELSE 0 END) AS October, SUM(CASE WHEN [Month] = 11 THEN Value ELSE 0 END) AS November, SUM(CASE WHEN [Month] = 12 THEN Value ELSE 0 END) AS December FROM ( SELECT s.[Month], f.Value FROM ( VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12) ) AS s([Month]) CROSS APPLY ( SELECT SUM(x.Value) FROM #Stage AS x WHERE x.[Month] <= s.[Month] ) AS f(Value) ) AS d)SELECT [Status], January, February, March, April, May, June, July, August, September, October, November, DecemberFROM cteSourceORDER BY theOrderDROP TABLE #Stage; N 56°04'39.26"E 12°55'05.63"
HI swepesoThanks! for the response, this worked wellhowever i have slightly different requirement this timecan you please check and help me onhttp://www.sqlteam.com/forums/topic.asp?TOPIC_ID=177606Thanks! |
 |
|
|
|
|