UNION 运算符是将两个或更多查询的结果组合为单个结果集
Item Color Quantity -------------------- -------------------- -------------------------- Table Blue 124 Table Red 223 Chair Blue 101 Chair Red 210
SELECT Item, Color, SUM(Quantity) AS QtySumFROM InventoryGROUP BY Item, Color WITH CUBE
Item Color QtySum -------------------- -------------------- -------------------------- Chair Blue 101.00 Chair Red 210.00 Chair (null) 311.00 Table Blue 124.00 Table Red 223.00 Table (null) 347.00 (null) (null) 658.00 (null) Blue 225.00 (null) Red 433.00
Chair (null) 311.00
Table (null) 347.00
(null) (null) 658.00
(null) Blue 225.00 (null) Red 433.00
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 QtySumFROM InventoryGROUP BY Item, Color WITH CUBE
SELECT CASE WHEN (GROUPING(Item) = 1) THEN 'ALL' ELSE ISNULL(Item, 'UNKNOWN') END AS Item, SUM(Quantity) AS QtySumFROM InventoryGROUP BY Item WITH CUBEGO
Item QtySum -------------------- -------------------------- Chair 311.00 Table 347.00 ALL 658.00
CREATE VIEW InvCube ASSELECT 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 QtySumFROM InventoryGROUP BY Item, Color WITH CUBE
SELECT *FROM InvCubeWHERE Item = 'Chair' AND Color = 'ALL'Item Color QtySum -------------------- -------------------- -------------------------- Chair ALL 311.00 (1 row(s) affected)
用 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 QtySumFROM InventoryGROUP BY Item, Color WITH ROLLUPItem 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 生成的更为高效。
- Microsoft® SQL Server™ 2000 Analysis Services 和用于 Analysis Services 的 OLE DB 或 Microsoft ActiveX® 数据对象(多维)(ADO MD) 一起使用。有关更多信息,请参见 Microsoft SQL Server™ 2000 Analysis Services。
- 可选的 BY 关键字,该关键字可按对一列计算指定的行聚合。
- 行聚合函数名称;例如,SUM、AVG、MIN、MAX 或 COUNT。
- 要对其执行行聚合函数的列。
- 每个组的第一个结果集是明细行集,其中包含该组的选择列表信息。
- 每个组的第二个结果集有一行,其中包含该组的 COMPUTE 子句中所指定的聚合函数的小计。
- 每个组的第一个结果集是包含选择列表信息的所有明细行。
- 第二个结果集有一行,其中包含 COMPUTE 子句中所指定的聚合函数的合计。
USE pubsSELECT type, price, advanceFROM titlesORDER BY typeCOMPUTE SUM(price), SUM(advance)
USE pubsSELECT type, price, advanceFROM titlesORDER BY typeCOMPUTE SUM(price), SUM(advance) BY type
- GROUP BY 生成单个结果集。每个组都有一个只包含分组依据列和显示该组子聚合的聚合函数的行。选择列表只能包含分组依据列和聚合函数。
- COMPUTE 生成多个结果集。一类结果集包含每个组的明细行,其中包含选择列表中的表达式。另一类结果集包含组的子聚合,或 SELECT 语句的总聚合。选择列表可包含除分组依据列或聚合函数之外的其它表达式。聚合函数在 COMPUTE 子句中指定,而不是在选择列表中。
USE pubsSELECT type, SUM(price), SUM(advance)FROM titlesGROUP BY type
本文详细介绍了SQL中的UNION、CUBE、ROLLUP等聚合函数的使用方法及其应用场景,包括如何生成多维数据集、实现数据汇总,并对比了不同函数的特点。

4504

被折叠的 条评论
为什么被折叠?



