zoukankan      html  css  js  c++  java
  • 统计报表(用ROLLUP 汇总数据)

    KeyLife富翁笔记
    作者: HongYuan
    标题: 统计报表(用ROLLUP 汇总数据)
    关键字:
    分类: sql server 2000
    密级: 私有
    (评分: , 回复: 0, 阅读: 5) »»

    统计报表(用ROLLUP 汇总数据)
    原贴:http://community.csdn.net/Expert/topic/4313/4313978.xml?temp=.691601


    表Inventory
    Item                 Color                Quantity                  
    -------------------- -------------------- --------------------------
    Table                Blue                 124                        
    Table                Red                  223                        
    Chair                Blue                 101                        
    Chair                Red                  210  

    要得到下面结果:

    Item                 Color                QtySum                    
    -------------------- -------------------- --------------------------
    Chair                Blue                 101.00                    
    Chair                Red                  210.00                    
    Chair小计                                 311.00                    
    Table                Blue                 124.00                    
    Table                Red                  223.00                    
    Table小计                                 347.00                    
    总计                                      658.00                    


    ---该问题是一个典型的使用Rollup生成结合的例子,联机帮助也有相关介绍!


    -测试环境
    declare @Inventory Table (Item varchar(20),Color varchar(20),Quantity money)
    insert into @Inventory select 'Table','Blue',124
    insert into @Inventory select 'Table','Red' ,223
    insert into @Inventory select 'Chair','Blue',101
    insert into @Inventory select 'Chair','Red' ,210

    --查询
    SELECT CASE WHEN (GROUPING(Item) = 1) THEN '总计'
                WHEN (GROUPING(Color) = 1) THEN Item+'小计'
                ELSE ISNULL(Item, 'UNKNOWN')
           END AS Item,
           CASE WHEN (GROUPING(Color) = 1) THEN ''
                ELSE ISNULL(Color, 'UNKNOWN')
           END AS Color,
           SUM(Quantity) AS QtySum
    FROM @Inventory
    GROUP BY Item, Color WITH ROLLUP

    --结果
    Item                     Color                QtySum                
    ------------------------ -------------------- ---------------------
    Chair                    Blue                 101.0000
    Chair                    Red                  210.0000
    Chair小计                                       311.0000
    Table                    Blue                 124.0000
    Table                    Red                  223.0000
    Table小计                                       347.0000
    总计                                            658.0000

    (所影响的行数为 7 行)


    2005-10-10 9:44:39   
     2005-10-10 10:01:01    GROUPING

    GROUPING
    是一个聚合函数,它产生一个附加的列,当用 CUBE 或 ROLLUP 运算符添加行时,附加的列输出值为1,当所添加的行不是由 CUBE 或 ROLLUP 产生时,附加列值为0。

    仅在与包含 CUBE 或 ROLLUP 运算符的 GROUP BY 子句相联系的选择列表中才允许分组。

    语法
    GROUPING ( column_name )

    参数
    column_name

    是 GROUP BY 子句中用于检查 CUBE 或 ROLLUP 空值的列。

    返回类型
    int

    注释
    分组用于区分由 CUBE 和 ROLLUP 返回的空值和标准的空值。作为CUBE 或 ROLLUP 操作结果返回的 NULL 是 NULL 的特殊应用。它在结果集内作为列的占位符,意思是"全体"。

     
     2005-10-10 10:02:45    用 ROLLUP 汇总数据

    用 ROLLUP 汇总数据
    在生成包含小计和合计的报表时,ROLLUP 运算符很有用。ROLLUP 运算符生成的结果集类似于 CUBE 运算符所生成的结果集。有关更多信息,请参见用 CUBE 汇总数据。

    CUBE 和 ROLLUP 之间的区别在于:

    CUBE 生成的结果集显示了所选列中值的所有组合的聚合。


    ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合。
    例如,简单表 Inventory 中包含:

    Item                 Color                Quantity                  
    -------------------- -------------------- --------------------------
    Table                Blue                 124                        
    Table                Red                  223                        
    Chair                Blue                 101                        
    Chair                Red                  210                        

    下列查询将生成小计报表:

    SELECT CASE WHEN (GROUPING(Item) = 1) THEN 'ALL'
                ELSE ISNULL(Item, 'UNKNOWN')
           END AS Item,
           CASE WHEN (GROUPING(Color) = 1) THEN 'ALL'
                ELSE ISNULL(Color, 'UNKNOWN')
           END AS Color,
           SUM(Quantity) AS QtySum
    FROM Inventory
    GROUP BY Item, Color WITH ROLLUP

    Item                 Color                QtySum                    
    -------------------- -------------------- --------------------------
    Chair                Blue                 101.00                    
    Chair                Red                  210.00                    
    Chair                ALL                  311.00                    
    Table                Blue                 124.00                    
    Table                Red                  223.00                    
    Table                ALL                  347.00                    
    ALL                  ALL                  658.00                    

    (7 row(s) affected)

    如果查询中的 ROLLUP 关键字更改为 CUBE,那么 CUBE 结果集与上述结果相同,只是在结果集的末尾还会返回下列两行:

    ALL                  Blue                 225.00                    
    ALL                  Red                  433.00                    

    CUBE 操作为 Item 和 Color 中值的可能组合生成行。例如,CUBE 不仅报告与 Item 值 Chair 相组合的 Color 值的所有可能组合(Red、Blue 和 Red + Blue),而且报告与 Color 值 Red 相组合的 Item 值的所有可能组合(Chair、Table 和 Chair + Table)。

    对于 GROUP BY 子句中右边的列中的每个值,ROLLUP 操作并不报告左边一列(或左边各列)中值的所有可能组合。例如,ROLLUP 并不对每个 Color 值报告 Item 值的所有可能组合。

    ROLLUP 操作的结果集具有类似于 COMPUTE BY 所返回结果集的功能;然而,ROLLUP 具有下列优点:

    ROLLUP 返回单个结果集;COMPUTE BY 返回多个结果集,而多个结果集会增加应用程序代码的复杂性。


    ROLLUP 可以在服务器游标中使用;COMPUTE BY 不可以。


    有时,查询优化器为 ROLLUP 生成的执行计划比为 COMPUTE BY 生成的更为高效。

    请参见

  • 相关阅读:
    将python对象序列化成php能读取的格式(即能反序列化到对象)
    Atitit.研发管理---api版本号策略与版本控制
    Atitit.研发管理---api版本号策略与版本控制
    Atitit.jsou html转换纯文本 java c# php
    Atitit.jsou html转换纯文本 java c# php
    atitit.基于bat cli的插件管理系统.doc
    atitit.基于bat cli的插件管理系统.doc
    atititi.soa  微服务 区别 联系 优缺点.doc
    atititi.soa  微服务 区别 联系 优缺点.doc
    userService 用户 会员 系统设计 v2 q224 .doc
  • 原文地址:https://www.cnblogs.com/ZhouXiHong/p/568220.html
Copyright © 2011-2022 走看看