做者:Bobby0322html
CUBE 和 ROLLUP 之間的區別在於:
CUBE 運算符生成的結果集是多維數據集。多維數據集是事實數據的擴展,事實數據即記錄個別事件的數據。擴展創建在用戶打算分析的列上。這些列被稱爲維。多維數據集是一個結果集,其中包含了各維度的全部可能組合的交叉表格。
CUBE 運算符在 SELECT 語句的 GROUP BY 子句中指定。該語句的選擇列表應包含維度列和聚合函數表達式。GROUP BY 應指定維度列和關鍵字 WITH CUBE。結果集將包含維度列中各值的全部可能組合,以及與這些維度值組合相匹配的基礎行中的聚合值。函數
CUBE 生成的結果集顯示了所選列中值的全部組合的聚合。
ROLLUP 生成的結果集顯示了所選列中值的某一層次結構的聚合。
GROUPING:
當用 CUBE 或 ROLLUP 運算符添加行時,附加的列輸出值爲1,當所添加的行不是由 CUBE 或 ROLLUP 產生時,附加列值爲0。spa
須要注意的是,使用有 WITH ROLLUP 子句的 GROUP BY 語句時,不能再使用 ORDER BY 語句對結果集進行排序,若是對返回的結果順序不滿意,須要應用程序得到結果後在程序中進行排序。
示例:3d
DECLARE @T TABLE ( 名稱 VARCHAR(10) , 出版商 VARCHAR(10) , 價格1 INT , 價格2 INT ) INSERT @T SELECT 'a' , '北京' , 11 , 22 UNION ALL SELECT 'a' , '四川' , 22 , 33 UNION ALL SELECT 'b' , '四川' , 12 , 23 UNION ALL SELECT 'b' , '北京' , 10 , 20 UNION ALL SELECT 'b' , '昆明' , 20 , 30 SELECT * FROM @T --WITH CUBE SELECT 名稱 , 出版商 , SUM(價格1) AS 價格1 , SUM(價格2) AS 價格2 , GROUPING(名稱) AS CHECK名稱 , GROUPING(出版商) AS CHECK出版商 FROM @T GROUP BY 名稱 , 出版商 WITH CUBE --WITH ROLLUP SELECT 名稱 , 出版商 , SUM(價格1) AS 價格1 , SUM(價格2) AS 價格2 FROM @T GROUP BY 名稱 , 出版商 WITH ROLLUP --GROUPING SELECT CASE WHEN ( GROUPING(名稱) = 1 ) THEN '總計' ELSE ISNULL(名稱, 'UNKNOWN') END AS 名稱 , CASE WHEN ( GROUPING(出版商) = 1 ) THEN '小計' ELSE ISNULL(出版商, 'UNKNOWN') END AS 出版商 , SUM(價格1) AS 價格1 , SUM(價格2) AS 價格2 FROM @T GROUP BY 名稱 , 出版商 WITH ROLLUP
WITH CUBE 結果集:code
WITH ROLLUP 結果集:htm
GROUPING結果集:blog