在生成包含小计和合计的报表时,ROLLUP 运算符很有用。ROLLUP 运算符生成的结果集类似于 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
不仅报告
Color
值与
Item
值
Chair
(
Red
、
Blue
和
Red
+
Blue
)的所有可能组合,还报告
Item
值与
Color
值
Red
(
Chair
、
Table
和
Chair
+
Table
)的所有可能
组合。 对于
GROUP BY
子句的右列中的每个值,
ROLLUP
操作并不报告左列中各值的所有可能组合。
例如,
ROLLUP
并不报告每个
Color
值的
Item
值的所有可能组合。
ROLLUP 操作的结果集与 COMPUTE BY 返回的结果集具有类似的功能。然而,ROLLUP 具有下列优点:ROLLUP 返回单个结果集,而 COMPUTE BY 返回多个结果集,而多个结果集会增加应用程序代码的复杂性。 ROLLUP 可以在服务器游标中使用,而 COMPUTE BY 则不可以。 有时,查询优化器为 ROLLUP 生成的执行计划比为 COMPUTE BY 生成的更为高效。
本文转自 august 51CTO博客,原文链接:http://blog.51cto.com/august/6931,如需转载请自行联系原作者