the SQL 2000 method is what i have been doing all my t-sql life. I was hoping with the new PIVOT operator in SQL 2005, i can simplify my query. However, in most of the time, i will have more than 1 aggregate value. In SQL 2000, it can simply be done with additional line of case . . when. in SQL 2005, the only work around i can come up with is to use derived table.
-- Sample DataDECLARE @sample TABLE( cola int, colb int, val int)INSERT INTO @sampleSELECT 10, 1, 100 UNION ALLSELECT 10, 2, 110 UNION ALLSELECT 10, 3, 110 UNION ALLSELECT 10, 3, 120 UNION ALLSELECT 20, 1, 200 UNION ALLSELECT 20, 3, 210 UNION ALLSELECT 30, 2, 310 UNION ALLSELECT 30, 3, 320-- SQL 2000 methodSELECT cola, [sum 1] = SUM(CASE WHEN colb = 1 THEN val END), [sum 2] = SUM(CASE WHEN colb = 2 THEN val END), [sum 3] = SUM(CASE WHEN colb = 3 THEN val END), [cnt 1] = COUNT(CASE WHEN colb = 1 THEN val END), [cnt 2] = COUNT(CASE WHEN colb = 2 THEN val END), [cnt 3] = COUNT(CASE WHEN colb = 3 THEN val END)FROM @sampleGROUP BY cola-- SQL 2005 PIVOT operatorSELECT s.cola, s.[1] AS [sum 1], s.[2] AS [sum 2], s.[3] AS [sum 3], c.[1] AS [cnt 1], c.[2] AS [cnt 2], c.[3] AS [cnt 3]FROM( SELECT cola, [1], [2], [3] FROM ( SELECT cola, colb, val FROM @sample ) a pivot ( -- sum() SUM(val) FOR colb IN ([1], [2], [3]) ) p) sINNER JOIN( SELECT cola, [1], [2], [3] FROM ( SELECT cola, colb, val FROM @sample ) a pivot ( -- count() COUNT(val) FOR colb IN ([1], [2], [3]) ) p) c ON s.cola = c.cola/* RESULT of both query :cola sum 1 sum 2 sum 3 cnt 1 cnt 2 cnt 3 ----------- ----------- ----------- ----------- ----------- ----------- ----------- 10 100 110 230 1 1 2 20 200 NULL 210 1 0 1 30 NULL 310 320 0 1 1 (3 row(s) affected)*/
KH[spoiler]Time is always against us[/spoiler]