小计和合计报表
在生成包含小计和合计的报表时,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 生成的更为高效。