共用方式為


SUM (Transact-SQL)

適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric 的 SQL 端點分析 Microsoft Fabric 的倉儲

傳回運算式中所有值的總和,或只傳回 DISTINCT 值的總和。 SUM 只能搭配數值資料行來使用。 會忽略 Null 值。

Transact-SQL 語法慣例

語法

-- Aggregate Function Syntax
SUM ( [ ALL | DISTINCT ] expression )

-- Analytic Function Syntax
SUM ( [ ALL ] expression) OVER ( [ partition_by_clause ] order_by_clause)

引數

ALL

將彙總函式套用至所有值。 ALL 是預設值。

DISTINCT

指定 SUM 傳回唯一值的總和。

expression

常數、數據行或函式,以及算術、位和字串運算元的任何組合。 expression 為精確數值或近似數值資料類型類別的運算式,但是 bit 資料類型除外。 不允許聚合函數和子查詢。 如需詳細資訊,請參閱運算式 (Transact-SQL)

OVER ( [ partition_by_clause ] order_by_clause

partition_by_clause 會將 FROM 子句產生的結果集分割成函數所要套用的分割區。 如未指定,此函數會將查詢結果集的所有資料列視為單一群組。 order_by_clause 可決定執行作業的邏輯順序。 order_by_clause 為必要項目。 如需詳細資訊,請參閱 OVER 子句 (Transact-SQL)

傳回型別

以最精確的 expression 資料類型傳回所有 expression 值的總和。

運算式結果 傳回類型
tinyint int
smallint int
int int
bigint bigint
decimal 類別 (p, s) decimal(38, s)
moneysmallmoney 類別 money
floatreal 類別 float

備註

SUM 未搭配 OVER 和 ORDER BY 子句使用時,是具決定性函數。 使用 OVER 和 ORDER BY 子句指定時,這是不具決定性的。 如需詳細資訊,請參閱 決定性與非決定性函數。 此外,當您搭配 float 和 real 數據類型使用 SUM 時,SUM 可能會顯示為非決定性函式。 但根本原因是這些數據類型的近似本質。

範例

A. 使用 SUM 傳回摘要資料

下列範例示範如何使用 SUM 函式傳回 AdventureWorks2022 資料庫中的摘要數據。

SELECT Color, SUM(ListPrice), SUM(StandardCost)
FROM Production.Product
WHERE Color IS NOT NULL
    AND ListPrice != 0.00
    AND Name LIKE 'Mountain%'
GROUP BY Color
ORDER BY Color;
GO

結果集如下所示。

Color
--------------- --------------------- ---------------------
Black           27404.84              5214.9616
Silver          26462.84              14665.6792
White           19.00                 6.7926

(3 row(s) affected)

B. 使用 OVER 子句

下列範例會使用 SUM 函式搭配 OVER 子句,為 AdventureWorks2022 資料庫中數據表中的每個 Sales.SalesPerson 地區提供每年累計銷售總額。 TerritoryID 負責分割資料,而 SalesYTD 會進行邏輯性地排序。 這表示,將會根據銷售年度來針對每一個領域計算 SUM 函數。 針對 TerritoryID 1,2005 年銷售年度有兩個數據列,代表當年銷售的兩位銷售人員。 計算這兩個數據列的累計總銷售額值,然後將代表 2006 年銷售額的第三個數據列包含在計算中。

SELECT BusinessEntityID, TerritoryID
   ,DATEPART(yy,ModifiedDate) AS SalesYear
   ,CONVERT(VARCHAR(20),SalesYTD,1) AS  SalesYTD
   ,CONVERT(VARCHAR(20),AVG(SalesYTD) OVER (PARTITION BY TerritoryID
                                            ORDER BY DATEPART(yy,ModifiedDate)
                                           ),1) AS MovingAvg
   ,CONVERT(VARCHAR(20),SUM(SalesYTD) OVER (PARTITION BY TerritoryID
                                            ORDER BY DATEPART(yy,ModifiedDate)
                                            ),1) AS CumulativeTotal
FROM Sales.SalesPerson
WHERE TerritoryID IS NULL OR TerritoryID < 5
ORDER BY TerritoryID,SalesYear;

結果集如下所示。

BusinessEntityID TerritoryID SalesYear   SalesYTD             MovingAvg            CumulativeTotal
---------------- ----------- ----------- -------------------- -------------------- --------------------
274              NULL        2005        559,697.56           559,697.56           559,697.56
287              NULL        2006        519,905.93           539,801.75           1,079,603.50
285              NULL        2007        172,524.45           417,375.98           1,252,127.95
283              1           2005        1,573,012.94         1,462,795.04         2,925,590.07
280              1           2005        1,352,577.13         1,462,795.04         2,925,590.07
284              1           2006        1,576,562.20         1,500,717.42         4,502,152.27
275              2           2005        3,763,178.18         3,763,178.18         3,763,178.18
277              3           2005        3,189,418.37         3,189,418.37         3,189,418.37
276              4           2005        4,251,368.55         3,354,952.08         6,709,904.17
281              4           2005        2,458,535.62         3,354,952.08         6,709,904.17

(10 row(s) affected)

在此範例中,OVER 子句不包含 PARTITION BY。 這表示,該函數將套用到查詢所傳回的所有資料列。 OVER 子句中指定的 ORDER BY 子句會決定套用 SUM 函數的邏輯順序。 此查詢會依照 WHERE 子句中指定的所有銷售領域傳回依年度的銷售量累計總和。 SELECT 陳述式中指定的 ORDER BY 子句會決定查詢的資料列顯示的順序。

SELECT BusinessEntityID, TerritoryID
   ,DATEPART(yy,ModifiedDate) AS SalesYear
   ,CONVERT(VARCHAR(20),SalesYTD,1) AS  SalesYTD
   ,CONVERT(VARCHAR(20),AVG(SalesYTD) OVER (ORDER BY DATEPART(yy,ModifiedDate)
                                            ),1) AS MovingAvg
   ,CONVERT(VARCHAR(20),SUM(SalesYTD) OVER (ORDER BY DATEPART(yy,ModifiedDate)
                                            ),1) AS CumulativeTotal
FROM Sales.SalesPerson
WHERE TerritoryID IS NULL OR TerritoryID < 5
ORDER BY SalesYear;

結果集如下所示。

BusinessEntityID TerritoryID SalesYear   SalesYTD             MovingAvg            CumulativeTotal
---------------- ----------- ----------- -------------------- -------------------- --------------------
274              NULL        2005        559,697.56           2,449,684.05         17,147,788.35
275              2           2005        3,763,178.18         2,449,684.05         17,147,788.35
276              4           2005        4,251,368.55         2,449,684.05         17,147,788.35
277              3           2005        3,189,418.37         2,449,684.05         17,147,788.35
280              1           2005        1,352,577.13         2,449,684.05         17,147,788.35
281              4           2005        2,458,535.62         2,449,684.05         17,147,788.35
283              1           2005        1,573,012.94         2,449,684.05         17,147,788.35
284              1           2006        1,576,562.20         2,138,250.72         19,244,256.47
287              NULL        2006        519,905.93           2,138,250.72         19,244,256.47
285              NULL        2007        172,524.45           1,941,678.09         19,416,780.93
(10 row(s) affected)

範例:Azure Synapse Analytics 和 Analytics Platform System (PDW)

C. 簡單的 SUM 範例

下列範例會傳回 2003 年每個產品銷售的總數。

-- Uses AdventureWorks

SELECT ProductKey, SUM(SalesAmount) AS TotalPerProduct
FROM dbo.FactInternetSales
WHERE OrderDateKey >= '20030101'
      AND OrderDateKey < '20040101'
GROUP BY ProductKey
ORDER BY ProductKey;

以下為部分結果集。

ProductKey  TotalPerProduct
----------  ---------------
214         31421.0200
217         31176.0900
222         29986.4300
225          7956.1500

D. 計算多個資料行的群組總計

下列範例會針對 ListPrice 資料表中所列出的每個顏色,來計算 StandardCostProduct 的總和。

-- Uses AdventureWorks

SELECT Color, SUM(ListPrice)AS TotalList,
       SUM(StandardCost) AS TotalCost
FROM dbo.DimProduct
GROUP BY Color
ORDER BY Color;

結果集的第一個部分如下所示:

Color       TotalList      TotalCost
----------  -------------  --------------
Black       101295.7191    57490.5378
Blue         24082.9484    14772.0524
Grey           125.0000       51.5625
Multi          880.7468      526.4095
NA            3162.3564     1360.6185