用 COMPUTE 和 COMPUTE BY 汇总数据

提供 COMPUTE 和 COMPUTE BY 是为了向后兼容。请改为使用下列组件:

COMPUTE BY 子句使您得以用同一 SELECT 语句既查看明细行,又查看汇总行。可以计算子组的汇总值,也可以计算整个结果集的汇总值。

COMPUTE 子句需要下列信息:

  • 可选 BY 关键字。它基于每一列计算指定的行聚合。

  • 行聚合函数名称。包括 SUM、AVG、MIN、MAX 或 COUNT。

  • 要对其执行行聚合函数的列。

COMPUTE 生成的结果集

COMPUTE 所生成的汇总值在查询结果中显示为单独的结果集。包括 COMPUTE 子句的查询结果类似于控制中断报表。此报表的汇总值由指定的分组(或中断)控制。可以为各组生成汇总值,也可以对同一组计算多个聚合函数。

当 COMPUTE 带有可选的 BY 子句时,符合 SELECT 条件的每个组都有两个结果集:

  • 每个组的第一个结果集是明细行集,其中包含该组的选择列表信息。

  • 每个组的第二个结果集有一行,其中包含该组的 COMPUTE 子句中所指定的聚合函数的小计。

当 COMPUTE 不带可选的 BY 子句时,SELECT 语句有两个结果集:

  • 每个组的第一个结果集是包含选择列表信息的所有明细行。

  • 第二个结果集有一行,其中包含 COMPUTE 子句中所指定的聚合函数的合计。

使用 COMPUTE 的示例

下列 SELECT 语句使用简单 COMPUTE 子句来生成 SalesOrderDetail 表的单价和折扣的总计:

USE AdventureWorks2008R2;
GO
SELECT SalesOrderID, UnitPrice, UnitPriceDiscount
FROM Sales.SalesOrderDetail
ORDER BY SalesOrderID
COMPUTE SUM(UnitPrice), SUM(UnitPriceDiscount);

下列查询在 COMPUTE 子句中加入 BY 关键字,以生成每个销售订单的小计。

USE AdventureWorks2008R2;
GO
SELECT SalesOrderID, UnitPrice, UnitPriceDiscount
FROM Sales.SalesOrderDetail
ORDER BY SalesOrderID
COMPUTE SUM(UnitPrice), SUM(UnitPriceDiscount) BY SalesOrderID;

此 SELECT 语句的结果为每个销售订单返回两个结果集。每个销售订单的第一个结果集是一个行集,其中包含选择列表中所指定的信息。每个销售订单的第二个结果集包含 COMPUTE 子句中的两个 SUM 函数的小计。

注意注意

在某些实用工具(如 osql)中,显示多个小计或合计聚合汇总,似乎每个总计都是结果集中的单独一行。这与该实用工具设置的输出格式有关;小计或合计聚合返回时单独占用一行。其他应用程序(如 SQL Server Management Studio)将多个聚合设置在同一行。

比较 COMPUTE 和 GROUP BY

COMPUTE 和 GROUP BY 之间的区别汇总如下:

  • GROUP BY 生成单个结果集。每个组都有一个只包含分组依据列和显示该组子聚合的聚合函数的行。选择列表只能包含分组依据列和聚合函数。

  • COMPUTE 生成多个结果集。一种结果集包含每个组的明细行,其中包含选择列表中的表达式。另一种结果集包含组的子聚合,或 SELECT 语句的总聚合。选择列表可包含除分组依据列或聚合函数之外的其他表达式。聚合函数在 COMPUTE 子句中指定,而不是在选择列表中指定。

下列查询使用 GROUP BY 和聚合函数。该查询将返回一个结果集,其中每个组有一行,该行包含该组的聚合小计。

USE AdventureWorks2008R2;
GO
SELECT SalesOrderID, SUM(UnitPrice), SUM(UnitPriceDiscount)
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID;
注意注意

您不能在 COMPUTE 或 COMPUTE BY 子句中包括 ntext、text 或 image 数据类型。

请参阅

参考

概念