【T-SQL系列】WITH ROLLUP、WITH CUBE、GROUPING语句的应用

原文:【T-SQL系列】WITH ROLLUP、WITH CUBE、GROUPING语句的应用

CUBE 和 ROLLUP 之间的区别在于:
CUBE 运算符生成的结果集是多维数据集。多维数据集是事实数据的扩展,事实数据即记录个别事件的数据。扩展建立在用户打算分析的列上。这些列被称为维。多维数据集是一个结果集,其中包含了各维度的所有可能组合的交叉表格。
CUBE 运算符在 SELECT 语句的 GROUP BY 子句中指定。该语句的选择列表应包含维度列和聚合函数表达式。GROUP BY 应指定维度列和关键字 WITH CUBE。结果集将包含维度列中各值的所有可能组合,以及与这些维度值组合相匹配的基础行中的聚合值。

CUBE 生成的结果集显示了所选列中值的所有组合的聚合。
ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合。
GROUPING:
当用 CUBE 或 ROLLUP 运算符添加行时,附加的列输出值为1,当所添加的行不是由 CUBE 或 ROLLUP 产生时,附加列值为0。

需要注意的是,使用有 WITH ROLLUP 子句的 GROUP BY 语句时,不能再使用 ORDER BY 语句对结果集进行排序,如果对返回的结果顺序不满意,需要应用程序获得结果后在程序中进行排序。
示例:

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 结果集:

WITH ROLLUP 结果集:

GROUPING结果集:

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。