WITH ROLLUP、WITH CUBE、GROUPING語句的應用

做者: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

相關文章
相關標籤/搜索