為什麼要引入ROLLUP?
可方便的生成"合計"、"小計"、"總計" 等混合統計的報表
如下數據集A經過ROLLUP運算可生成數據集B
接下來用上圖中的A表做各種測試:
1.ROLLUP簡單應用
SELECT Groups,Item,Color FROM @t GROUP BY Groups,Item,Color WITH ROLLUP
查詢結果如下:
如果用ROLLUP的另一個關鍵字CUBE產生的結果如下:
SELECT Groups,Item,Color FROM @t GROUP BY Groups,Item,Color WITH CUBE
結果:
引出一個概念:
維:查詢所指定的列稱為維,列的個數稱為維度
以上兩個SQL語句涉及三個維度,ROLLUP和CUBE都可以用於多維計算,不同點在於CUBE可以包含所有緯度的組合,而
ROLLUP只涉及指定列的維度計算。
2.ROLLUP運算關鍵字GROUPING
GROUPING:判斷是否為多維計算中的附加列,如果是則輸出1,否則輸出0
SELECT Groups= CASE WHEN GROUPING(GROUPS)=1 THEN 1 ELSE 0 END ,Item,Color FROM @t GROUP BY Groups,Item,Color WITH ROLLUP
結果:
引入ROLLUP可以方便的對查詢結果排序或自定義附加列的格式
排序應用:
SELECT Groups,Item,Color FROM @t GROUP BY Groups,Item,Color WITH ROLLUP ORDER BY GROUPING(Groups),Groups DESC
結果:
補充:關於漢字、字母、null、空值、數字的排序問題
SELECT * FROM @t ORDER BY groups DESC
結果:
至於自定義附加列的樣式在第三步講解
3.ROLLUP綜合運用
SELECT Groups=CASE
WHEN GROUPING(Color)=0 THEN Groups
WHEN GROUPING(Groups)=1 THEN '總計'
ELSE '' END,
Item=CASE
WHEN GROUPING(Color)=0 THEN Item
WHEN GROUPING(Item)=1 THEN Groups+' 合計'
ELSE '' END,
Color=CASE
WHEN GROUPING(Color)=0 THEN Color
WHEN GROUPING(Color)=1 THEN Item+' 小計'
ELSE '' END,
Quantity=SUM(Quantity)
FROM @t
GROUP BY Groups,Item,Color WITH ROLLUP
ORDER BY GROUPING(Groups),
CASE WHEN GROUPING(Groups)=0 THEN Groups END DESC,
GROUPING(Item),
CASE WHEN GROUPING(Item)=0 THEN Item END DESC,
GROUPING(Color),
CASE WHEN GROUPING(Color)=0 THEN Color END DESC
結果: