适用于: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 数据类型除外)的表达式。 不允许聚合函数和子查询。 有关详细信息,请参阅表达式。
OVER ([ 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 OVERORDER 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. 使用超额条款
以下示例使用 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