统计报表(用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 生成的更为高效。

请参见

原文地址:https://www.cnblogs.com/ZhouXiHong/p/568220.html