with rollup 、with cube、grouping
CUBE 和 ROLLUP 之間的區別在於:
CUBE 生成的結果集顯示了所選列中值的全部組合的聚合。
ROLLUP 生成的結果集顯示了所選列中值的某一層次結構的聚合。
grouping:
當用 CUBE 或 ROLLUP 運算符添加行時,附加的列輸出值爲1,當所添加的行不是由 CUBE 或 ROLLUP 產生時,附加列值爲0。web
(GROUPING這個函數是反映目標列是否聚合,如何聚合則返回1,不然返回0)函數
--例如
DECLARE@TTABLE(名稱 VARCHAR(1) , 出版商 VARCHAR(10), 價格1 INT, 價格2 INT)
INSERT@T
SELECT'a', '北京', 11, 22UNIONALL
SELECT'a', '四川', 22, 33UNIONALL
SELECT'b', '四川', 12, 23UNIONALL
SELECT'b', '北京', 10, 20UNIONALL
SELECT'b', '昆明', 20, 30
SELECT
名稱,
出版商,
SUM(價格1) AS 價格1,
SUM(價格2) AS 價格2,
GROUPING(名稱) AS CHECK名稱,
GROUPING(出版商) AS CHECK出版商
FROM@TGROUPBY 名稱,出版商 WITH CUBEspa
/*
名稱 出版商 價格1 價格2 CHECK名稱 CHECK出版商
---- ---------- ----------- ----------- ------- --------
a 北京 11 22 0 0
a 四川 22 33 0 0
a NULL 33 55 0 1
b 北京 10 20 0 0
b 昆明 20 30 0 0
b 四川 12 23 0 0
b NULL 42 73 0 1
NULL NULL 75 128 1 1
NULL 北京 21 42 1 0
NULL 昆明 20 30 1 0
NULL 四川 34 56 1 0
(所影響的行數爲 11 行)
*/
--分析
/*group by 兩列:名稱有兩個類別A,B;全部由CUBE運算而生成行的是
名稱 出版商 價格1 價格2 CHECK名稱 CHECK出版商
---- ---------- ----------- ----------- ------- --------
a NULL 33 55 0 1
b NULL 42 73 0 1
出版商有三個類別,全部由CUBE運算而生成行的是
名稱 出版商 價格1 價格2 CHECK名稱 CHECK出版商
---- ---------- ----------- ----------- ------- --------
NULL 北京 21 42 1 0
NULL 昆明 20 30 1 0
NULL 四川 34 56 1 0
以及
NULL NULL 75 128 1 1
*/orm
SELECT
名稱,
出版商,
SUM(價格1) AS 價格1,
SUM(價格2) AS 價格2
FROM@TGROUPBY 名稱,出版商 WITH ROLLUPci
/*
名稱 出版商 價格1 價格2
---- ---------- ----------- -----------
a 北京 11 22
a 四川 22 33
a NULL 33 55
b 北京 10 20
b 昆明 20 30
b 四川 12 23
b NULL 42 73
NULL NULL 75 128
*/it