使用 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 操作为 ItemColor 中值的可能组合生成行。例如,CUBE 不仅报告 Color 值与 ItemChairRedBlueRed + Blue)的所有可能组合,还报告 Item 值与 ColorRedChairTableChair + Table)的所有可能组合。

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

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

  • ROLLUP 返回单个结果集,而 COMPUTE BY 返回多个结果集,而多个结果集会增加应用程序代码的复杂性。
  • ROLLUP 可以在服务器游标中使用,而 COMPUTE BY 则不可以。
  • 有时,查询优化器为 ROLLUP 生成的执行计划比为 COMPUTE BY 生成的更为高效。

请参阅

概念

用 COMPUTE 和 COMPUTE BY 汇总数据

其他资源

SELECT (Transact-SQL)

帮助和信息

获取 SQL Server 2005 帮助