生成合计作为附加的汇总列出现在结果集的最后。当与 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 关键字。
将整数数据相加或求其平均值时,即使列的数据类型为 smallint 或 tinyint,Microsoft SQL Server 2005 数据库引擎 也将结果视为 int 值。有关将数据相加或求平均值时的返回类型的详细信息,请参阅 SUM (Transact-SQL) 和 AVG (Transact-SQL)。
注意:为减少 ODBC 和 DB-Library 程序中出现溢出错误的可能性,请将平均或汇总结果的所有变量声明都设置为数据类型 int。
expression
表达式(Transact-SQL),如对其执行计算的列名。 expression 必须出现在选择列表中,并且必须被指定为与选择列表中的某个表达式相同。不能在 expression 中使用选择列表中所指定的列别名。
注意:不能在 COMPUTE 或 COMPUTE BY 子句中指定 ntext、 text 或 image 数据类型。
BY expression
在结果集中生成控制中断和小计。 expression 是关联 ORDER BY 子句中 order_by_expression 的相同副本。通常,这是列名或列别名。可以指定多个表达式。在 BY 之后列出多个表达式将把组划分为子组,并在每个组级别应用聚合函数。
如果使用 COMPUTE BY,则还必须使用 ORDER BY 子句。表达式必须与在 QRDER BY 后列出的子句相同或是其子集,并且顺序必须相同。例如,如果 ORDER BY 子句为 ORDER BY a, b, c,则 COMPUTE 子句可以为以下任意项或所有项:
[url=javascript:CopyCode('ctl00_rs1_mainContentContainer_ctl23other');] 复制代码[/url]
COMPUTE BY a, b, cCOMPUTE BY a, bCOMPUTE BY a
注意:在带有 COMPUTE 子句的 SELECT 语句中,选择列表中的列顺序优于 COMPUTE 子句中的聚合函数顺序。ODBC 和 DB-library 程序员必须知道这种顺序要求,以将聚合函数结果放在正确的位置。
由于包含 COMPUTE 的语句生成表并且这些表的汇总结果不存储在数据库中,因此在 SELECT INTO 语句中不能使用 COMPUTE。因而,任何由 COMPUTE 生成的计算结果都不会出现在用 SELECT INTO 语句创建的新表内。
当 SELECT 语句是 DECLARE CURSOR 语句的一部分时,不能使用 COMPUTE 子句。
示例
A. 在查询中使用 COMPUTE 返回合计在以下示例中,SELECT 语句使用简单的 COMPUTE 子句生成 SalesOrderHeader 表中 SubTotal 与 TotalDue 的和的合计。
[url=javascript:CopyCode('ctl00_rs1_mainContentContainer_ctl29other');] 复制代码[/url]
USE AdventureWorks;GOSELECT CustomerID, OrderDate, SubTotal, TotalDueFROM Sales.SalesOrderHeaderWHERE SalesPersonID = 35ORDER BY OrderDate COMPUTE SUM(SubTotal), SUM(TotalDue);
B. 在查询中使用 COMPUTE 返回合计在以下示例中,SELECT 语句使用 COMPUTE 子句按销售人员生成 SalesOrderHeader 表中 SubTotal 与 TotalDue 的和的合计。
[url=javascript:CopyCode('ctl00_rs1_mainContentContainer_ctl30other');] 复制代码[/url]
USE AdventureWorks;GOSELECT SalesPersonID, CustomerID, OrderDate, SubTotal, TotalDueFROM Sales.SalesOrderHeaderORDER BY SalesPersonID, OrderDate COMPUTE SUM(SubTotal), SUM(TotalDue) BY SalesPersonID;
请参阅
参考[url=http://msdn.microsoft.com/zh-cn/library/ms189499(SQL.90).aspx] SELECT (Transact-SQL)[/url]
[url=http://msdn.microsoft.com/zh-cn/library/ms188385(SQL.90).aspx] ORDER BY 子句 (Transact-SQL)[/url]
帮助和信息 [url=http://msdn.microsoft.com/zh-cn/library/ms166016(SQL.90).aspx] 获取 SQL Server 2005 帮助 [/url]
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 关键字。
将整数数据相加或求其平均值时,即使列的数据类型为 smallint 或 tinyint,Microsoft SQL Server 2005 数据库引擎 也将结果视为 int 值。有关将数据相加或求平均值时的返回类型的详细信息,请参阅 SUM (Transact-SQL) 和 AVG (Transact-SQL)。
注意:为减少 ODBC 和 DB-Library 程序中出现溢出错误的可能性,请将平均或汇总结果的所有变量声明都设置为数据类型 int。
expression
表达式(Transact-SQL),如对其执行计算的列名。 expression 必须出现在选择列表中,并且必须被指定为与选择列表中的某个表达式相同。不能在 expression 中使用选择列表中所指定的列别名。
注意:不能在 COMPUTE 或 COMPUTE BY 子句中指定 ntext、 text 或 image 数据类型。
BY expression
在结果集中生成控制中断和小计。 expression 是关联 ORDER BY 子句中 order_by_expression 的相同副本。通常,这是列名或列别名。可以指定多个表达式。在 BY 之后列出多个表达式将把组划分为子组,并在每个组级别应用聚合函数。
如果使用 COMPUTE BY,则还必须使用 ORDER BY 子句。表达式必须与在 QRDER BY 后列出的子句相同或是其子集,并且顺序必须相同。例如,如果 ORDER BY 子句为 ORDER BY a, b, c,则 COMPUTE 子句可以为以下任意项或所有项:
[url=javascript:CopyCode('ctl00_rs1_mainContentContainer_ctl23other');] 复制代码[/url]
COMPUTE BY a, b, cCOMPUTE BY a, bCOMPUTE BY a
注意:在带有 COMPUTE 子句的 SELECT 语句中,选择列表中的列顺序优于 COMPUTE 子句中的聚合函数顺序。ODBC 和 DB-library 程序员必须知道这种顺序要求,以将聚合函数结果放在正确的位置。
由于包含 COMPUTE 的语句生成表并且这些表的汇总结果不存储在数据库中,因此在 SELECT INTO 语句中不能使用 COMPUTE。因而,任何由 COMPUTE 生成的计算结果都不会出现在用 SELECT INTO 语句创建的新表内。
当 SELECT 语句是 DECLARE CURSOR 语句的一部分时,不能使用 COMPUTE 子句。
示例
A. 在查询中使用 COMPUTE 返回合计在以下示例中,SELECT 语句使用简单的 COMPUTE 子句生成 SalesOrderHeader 表中 SubTotal 与 TotalDue 的和的合计。
[url=javascript:CopyCode('ctl00_rs1_mainContentContainer_ctl29other');] 复制代码[/url]
USE AdventureWorks;GOSELECT CustomerID, OrderDate, SubTotal, TotalDueFROM Sales.SalesOrderHeaderWHERE SalesPersonID = 35ORDER BY OrderDate COMPUTE SUM(SubTotal), SUM(TotalDue);
B. 在查询中使用 COMPUTE 返回合计在以下示例中,SELECT 语句使用 COMPUTE 子句按销售人员生成 SalesOrderHeader 表中 SubTotal 与 TotalDue 的和的合计。
[url=javascript:CopyCode('ctl00_rs1_mainContentContainer_ctl30other');] 复制代码[/url]
USE AdventureWorks;GOSELECT SalesPersonID, CustomerID, OrderDate, SubTotal, TotalDueFROM Sales.SalesOrderHeaderORDER BY SalesPersonID, OrderDate COMPUTE SUM(SubTotal), SUM(TotalDue) BY SalesPersonID;
请参阅
参考[url=http://msdn.microsoft.com/zh-cn/library/ms189499(SQL.90).aspx] SELECT (Transact-SQL)[/url]
[url=http://msdn.microsoft.com/zh-cn/library/ms188385(SQL.90).aspx] ORDER BY 子句 (Transact-SQL)[/url]
帮助和信息 [url=http://msdn.microsoft.com/zh-cn/library/ms166016(SQL.90).aspx] 获取 SQL Server 2005 帮助 [/url]