zoukankan      html  css  js  c++  java
  • WITH ROLLUP、WITH CUBE、GROUPING语句的应用

    作者:Bobby0322

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

  • 相关阅读:
    C++ 把输出结果写入文件/从文件中读取数据
    转载:C++之高精度算法
    借助bool判断使冒泡排序效率提高
    启程
    2017总结,2018的路
    mysql 分组排序
    2021年VS2019最新有效的调试ASP.NET Core源码
    神级Java程序员 开车教你基础开发,最简单 微型Java Web框架
    手把手教你 基础 整合最优雅SSM框架:SpringMVC + Spring
    学习Java绝对要懂的,Java编程中最常用的几种排序算法!
  • 原文地址:https://www.cnblogs.com/lxl57610/p/7402061.html
Copyright © 2011-2022 走看看