COMPUTE (Transact-SQL)
產生在結果集結尾顯示為其他摘要資料行的總計。當搭配 BY 使用時,COMPUTE 子句會在結果集中產生 control-break 和小計。您可以在相同查詢中,指定 COMPUTE BY 和 COMPUTE。
重要事項 |
---|
下一版的 Microsoft SQL Server 將不再提供此功能。請勿在新的開發工作中使用此功能,並且儘速修改使用此功能的應用程式。 改用 ROLLUP。如需詳細資訊,請參閱<GROUP BY (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 子句。
這些函數會忽略 Null 值。
當利用 COMPUTE 子句來指定資料列彙總函式時,不允許使用 DISTINCT 關鍵字。
當您加入或平均整數資料時,SQL Server Database Engine 會將結果當作 int 值來處理,即使資料行的資料類型是 smallint 或 tinyint,也是如此。如需有關加入或平均資料之傳回類型的詳細資訊,請參閱<SUM (Transact-SQL)>和<AVG (Transact-SQL)>。
[!附註]
若要減少 ODBC 和 DB-Library 程式發生溢位錯誤的機會,請使平均或總和結果的所有變數宣告都成為 int 資料類型。
expression
執行的計算所針對的資料行名稱之類的 運算式 (Transact-SQL)。expression 必須出現在選取清單中,且必須指定成與選取清單中的某個運算式相同。在 expression 內,不能使用選取清單所指定的資料行別名。[!附註]
在 COMPUTE 或 COMPUTE BY 子句中,不能指定 ntext、text 或 image 資料類型。
BY expression
在結果集中,產生 control-break 和小計。expression 是相關聯的 ORDER BY 子句中之 order_by_expression 的完全相同的副本。這通常是資料行名稱或資料行別名。您可以指定多個運算式。在 BY 之後列出多個運算式,會將群組分成子群組,且會在每個分組層級上套用彙總函式。如果您使用 COMPUTE BY,您也必須使用 ORDER BY 子句。這些運算式必須與 ORDER BY 之後所列出者相同,或是它們的子集,且順序必須相同。例如,如果 ORDER BY 子句是 ORDER BY a, b, c,COMPUTE 子句可以是下列中的全部或任何一項:
COMPUTE BY a, b, c COMPUTE BY a, b COMPUTE BY a
[!附註]
在含有 COMPUTE 子句的 SELECT 陳述式中,選取清單中的資料行順序會覆寫 COMPUTE 子句中的彙總函式順序。ODBC 和 DB-Library 程式設計人員必須瞭解這項順序需求,才能將彙總函式結果放在正確的位置。
您不能在 SELECT INTO 陳述式中使用 COMPUTE,因為包含 COMPUTE 的陳述式會產生資料表,它們的摘要結果不會儲存在資料庫中。因此,COMPUTE 所產生的任何計算都不會出現在 SELECT INTO 陳述式所建立的新資料表中。
當 SELECT 陳述式是 DECLARE CURSOR 陳述式的一部份時,您無法使用 COMPUTE 子句。
範例
A. 在查詢中利用 COMPUTE 來傳回總計
在下列範例中,SELECT 陳述式會利用簡單的 COMPUTE 子句,來產生 SalesOrderHeader 資料表 SubTotal 與 TotalDue 之和的總計。
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 資料表的 SubTotal 與 TotalDue 之總和的個別銷售人員總計。
USE AdventureWorks;
GO
SELECT SalesPersonID, CustomerID, OrderDate, SubTotal, TotalDue
FROM Sales.SalesOrderHeader
ORDER BY SalesPersonID, OrderDate
COMPUTE SUM(SubTotal), SUM(TotalDue) BY SalesPersonID;