共用方式為


SUM(Transact-SQL)

適用於:SQL ServerAzure SQL 資料庫Azure SQL 受控執行個體Azure Synapse Analytics分析平台系統(PDW)Microsoft Fabric 中的 SQL 分析端點Microsoft Fabric 中的倉儲Microsoft Fabric 中的 SQL 資料庫

回傳表達式中所有值的總和,或僅 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 資料類型除外。 不允許聚合函數和子查詢。 如需詳細資訊,請參閱運算式

超過 ( [ partition_by_clause ] [ order_by_clause ] )

partition_by_clause 會將子句所 FROM 產生的結果集分割成套用函式的分割區。 如未指定,此函數會將查詢結果集的所有資料列視為單一群組。

order_by_clause 可決定執行作業的邏輯順序。 如需相關資訊,請參閱 SELECT - OVER 子句

傳回類型

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

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

備註

SUM在不使用 and OVER 子句時ORDER BY是一個確定性函數。 當使用 and OVER 子句指定ORDER BY時,它是不確定的。 如需詳細資訊,請參閱確定性與非確定性函式

另外,當你用SUM資料型態使用時,可能會看起來像非確定性函數。 但根本原因是這些數據類型的近似本質。

範例

本文中的程式代碼範例會使用 AdventureWorks2025AdventureWorksDW2025 範例資料庫,您可以從 Microsoft SQL Server 範例和社群專案 首頁下載。

A. 使用 sum 來回傳摘要資料

以下範例展示了使用 SUM 函式在 AdventureWorks2025 資料庫中回傳摘要資料的過程。

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

B. 使用over條款

以下範例使用 SUM 帶有 OVER 子句的函數,提供 AdventureWorks2025 資料庫中每個區域 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

在這裡範例中,子 OVER 句不包含 PARTITION BY。 這表示函式會套用至查詢傳回的所有數據列。 ORDER BY子句中指定的 OVER 子句會決定套用函式的SUM邏輯順序。 查詢會回傳條款中 WHERE 指定的所有銷售區域的年度累計銷售總數。 ORDER BY語句中指定的 SELECT 子句會決定查詢數據列的顯示順序。

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

範例: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