適用於:SQL Server
Azure SQL 資料庫
Azure SQL 受控執行個體
Azure Synapse Analytics
分析平台系統(PDW)
Microsoft Fabric 中的 SQL 分析端點
Microsoft Fabric 中的倉儲
Microsoft Fabric 中的 SQL 資料庫
回傳表達式中所有值的總和,或僅 DISTINCT 回傳這些值。
SUM 只能與數字欄位一起使用。 會忽略 Null 值。
語法
-- 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) |
| money 和 smallmoney 類別 | money |
| float 和 real 類別 | float |
備註
SUM在不使用 and OVER 子句時ORDER BY是一個確定性函數。 當使用 and OVER 子句指定ORDER BY時,它是不確定的。 如需詳細資訊,請參閱確定性與非確定性函式。
另外,當你用SUM資料型態使用時,可能會看起來像非確定性函數。 但根本原因是這些數據類型的近似本質。
範例
本文中的程式代碼範例會使用 AdventureWorks2025 或 AdventureWorksDW2025 範例資料庫,您可以從 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 資料表中所列出的每個顏色,來計算 StandardCost 和 Product 的總和。
-- 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