Поделиться через


SUM (Transact-SQL)

Применимо к:SQL ServerБаза данных Azure SQLУправляемый экземпляр Azure SQLAzure Synapse AnalyticsСистема платформы аналитики (PDW)Конечная точка SQL аналитики в Microsoft FabricХранилище в 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 — это значение по умолчанию.

DISTINCT

Задаёт, что SUM возвращает сумму уникальных значений.

выражение

Константы, столбцы или функции и любое сочетание арифметических, битовых и строковых операторов. expression — выражение категории точного числового или приблизительного числового типа данных, за исключением типа данных bit. Агрегатные функции и вложенные запросы не разрешены. Дополнительные сведения см. в разделе Выражения.

ПРИЁМ ( [ partition_by_clause ] [ order_by_clause ]

partition_by_clause делит результирующий набор, созданный FROM предложением, на секции, к которым применяется функция. Если этот параметр не указан, функция обрабатывает все строки результирующего набора запроса как отдельные группы.

order_by_clause определяет логический порядок, в котором выполняется операция. Дополнительные сведения см. в предложении SELECT - OVER.

Типы возвращаемых данных

Возвращает сумму всех значений выражения, представленную в наиболее точном типе данных выражения.

Результат выражения Возвращаемый тип
tinyint int
smallint int
int int
bigint bigint
Категория decimal (p, s) Десятичная система (38, с)
Категории money и smallmoney money
Категории float и real float

Замечания

SUM — детерминированная функция при использовании без OVER предложений и ORDER BY предложений. Он недетерминирован при указании в OVER предложениях и ORDER BY предложениях. Дополнительные сведения см. в разделе детерминированные и недетерминированные функции.

Также SUM может показаться, что функция не детерминирована, если использовать её с плавающими и вещественными типами данных. Но основная причина — это приблизительная природа этих типов данных.

Примеры

Примеры кода в этой статье используют базу данных образца AdventureWorks2025 или AdventureWorksDW2025, которую можно скачать с домашней страницы образцов и проектов сообщества Microsoft SQL Server и.

А. Используйте сумму для возврата сводных данных

Следующие примеры демонстрируют использование функции 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 для получения суммарного суммы годовых продаж для каждой территории в Sales.SalesPerson таблице базы данных AdventureWorks2025. Данные секционируются по 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 и система платформы аналитики (PDW)

В. Простой пример функции 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