COMPUTE (Transact-SQL)

生成合计作为附加的汇总列出现在结果集的最后。当与 BY 一起使用时,COMPUTE 子句在结果集内生成控制中断和小计。可在同一查询内指定 COMPUTE BY 和 COMPUTE。

主题链接图标Transact-SQL 语法约定

语法


[ COMPUTE 
    { { AVG | COUNT | MAX | MIN | STDEV | STDEVP | VAR | VARP | SUM } 
    ( expression ) } [ ,...n ] 
    [ BY expression [ ,...n ] ] 
]

参数

AVG | COUNT | MAX | MIN | STDEV | STDEVP | VAR | VARP | SUM

指定要执行的聚合。下面是 COMPUTE 子句使用的行聚合函数。

行聚合函数 结果

AVG

数值表达式中所有值的平均值

COUNT

选定的行数

MAX

表达式中的最高值

MIN

表达式中的最低值

STDEV

表达式中所有值的标准偏差

STDEVP

表达式中所有值的总体标准偏差

SUM

数值表达式中所有值的和

VAR

表达式中所有值的方差

VARP

表达式中所有值的总体方差

没有等价于 COUNT(*) 的函数。若要查找由 GROUP BY 和 COUNT(*) 生成的汇总信息,请使用不带 BY 的 COMPUTE 子句。

这些函数忽略空值。

如果是用 COMPUTE 子句指定的行聚合函数,则不允许它们使用 DISTINCT 关键字。

将整数数据相加或求其平均值时,即使列的数据类型为 smallinttinyint,Microsoft SQL Server 2005 数据库引擎 也将结果视为 int 值。有关将数据相加或求平均值时的返回类型的详细信息,请参阅 SUM (Transact-SQL)AVG (Transact-SQL)

ms181708.note(zh-cn,SQL.90).gif注意:
为减少 ODBC 和 DB-Library 程序中出现溢出错误的可能性,请将平均或汇总结果的所有变量声明都设置为数据类型 int

expression

表达式(Transact-SQL),如对其执行计算的列名。expression 必须出现在选择列表中,并且必须被指定为与选择列表中的某个表达式相同。不能在 expression 中使用选择列表中所指定的列别名。

ms181708.note(zh-cn,SQL.90).gif注意:
不能在 COMPUTE 或 COMPUTE BY 子句中指定 ntexttextimage 数据类型。

BY expression

在结果集中生成控制中断和小计。expression 是关联 ORDER BY 子句中 order_by_expression 的相同副本。通常,这是列名或列别名。可以指定多个表达式。在 BY 之后列出多个表达式将把组划分为子组,并在每个组级别应用聚合函数。

如果使用 COMPUTE BY,则还必须使用 ORDER BY 子句。表达式必须与在 QRDER BY 后列出的子句相同或是其子集,并且顺序必须相同。例如,如果 ORDER BY 子句为 ORDER BY a, b, c,则 COMPUTE 子句可以为以下任意项或所有项:

COMPUTE BY a, b, c
COMPUTE BY a, b
COMPUTE BY a
ms181708.note(zh-cn,SQL.90).gif注意:
在带有 COMPUTE 子句的 SELECT 语句中,选择列表中的列顺序优于 COMPUTE 子句中的聚合函数顺序。ODBC 和 DB-library 程序员必须知道这种顺序要求,以将聚合函数结果放在正确的位置。

由于包含 COMPUTE 的语句生成表并且这些表的汇总结果不存储在数据库中,因此在 SELECT INTO 语句中不能使用 COMPUTE。因而,任何由 COMPUTE 生成的计算结果都不会出现在用 SELECT INTO 语句创建的新表内。

当 SELECT 语句是 DECLARE CURSOR 语句的一部分时,不能使用 COMPUTE 子句。

示例

A. 在查询中使用 COMPUTE 返回合计

在以下示例中,SELECT 语句使用简单的 COMPUTE 子句生成 SalesOrderHeader 表中 SubTotalTotalDue 的和的合计。

USE AdventureWorks;
GO
SELECT CustomerID, OrderDate, SubTotal, TotalDue
FROM Sales.SalesOrderHeader
WHERE SalesPersonID = 35
ORDER BY OrderDate 
COMPUTE SUM(SubTotal), SUM(TotalDue);

B. 在查询中使用 COMPUTE 返回合计

在以下示例中,SELECT 语句使用 COMPUTE 子句按销售人员生成 SalesOrderHeader 表中 SubTotalTotalDue 的和的合计。

USE AdventureWorks;
GO
SELECT SalesPersonID, CustomerID, OrderDate, SubTotal, TotalDue
FROM Sales.SalesOrderHeader
ORDER BY SalesPersonID, OrderDate 
COMPUTE SUM(SubTotal), SUM(TotalDue) BY SalesPersonID;

请参阅

参考

SELECT (Transact-SQL)
ORDER BY 子句 (Transact-SQL)

帮助和信息

获取 SQL Server 2005 帮助