SUM (Transact-SQL)
Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics PDW (Analytics Platform System) Ponto de extremidade de análise do SQL Warehouse no Microsoft Fabric
Retorna a soma de todos os valores ou somente os valores DISTINCT na expressão. SUM pode ser usado exclusivamente com colunas numéricas. Valores nulos são ignorados.
Convenções de sintaxe de Transact-SQL
Sintaxe
-- Aggregate Function Syntax
SUM ( [ ALL | DISTINCT ] expression )
-- Analytic Function Syntax
SUM ( [ ALL ] expression) OVER ( [ partition_by_clause ] order_by_clause)
Argumentos
ALL
Aplica a função de agregação a todos os valores. ALL é o padrão.
DISTINTO
Especifica que SUM retorna a soma de valores exclusivos.
expressão
Uma constante, coluna ou função e qualquer combinação de operadores aritméticos, bit a bit e string. expression é uma expressão da categoria de tipo de dados numérico exato ou numérico aproximado, com exceção do tipo de dados bit. Funções agregadas e subconsultas não são permitidas. Para obter mais informações, confira Expressões (Transact-SQL).
OVER ( [ partition_by_clause ] order_by_clause)
partition_by_clause divide o conjunto de resultados produzido pela cláusula FROM em partições às quais a função é aplicada. Se não for especificado, a função tratará todas as linhas do conjunto de resultados da consulta como um único grupo. order_by_clause determina a ordem lógica na qual a operação é executada. order_by_clause é obrigatório. Para obter mais informações, confira Cláusula OVER (Transact-SQL).
Tipos de retorno
Retorna o somatório de todos os valores de expression no tipo de dados de expression mais preciso.
Resultado da expressão | Tipo de retorno |
---|---|
tinyint | int |
smallint | int |
int | int |
bigint | bigint |
Categoria decimal (p, s) | decimal(38, s) |
Categorias money e smallmoney | money |
Categorias float e real | float |
Comentários
SUM é uma função determinística quando usada sem as cláusulas OVER e ORDER BY. É não determinístico quando especificado com as cláusulas OVER e ORDER BY. Para obter mais informações, veja Funções determinísticas e não determinísticas. Além disso, SUM pode parecer se comportar como uma função não determinística quando você a usa com tipos de dados float e real . Mas o motivo subjacente é a natureza aproximada desses tipos de dados.
Exemplos
a. Usando SUM para retornar dados resumidos
Os exemplos a seguir mostram como usar a função SUM para retornar dados resumidos no banco de dados 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
Veja a seguir o conjunto de resultados.
Color
--------------- --------------------- ---------------------
Black 27404.84 5214.9616
Silver 26462.84 14665.6792
White 19.00 6.7926
(3 row(s) affected)
B. Usando a cláusula OVER
O exemplo a seguir usa a função SUM com a cláusula OVER para fornecer um total cumulativo de vendas anuais para cada território na tabela Sales.SalesPerson
no banco de dados AdventureWorks2022. Os dados são particionados por TerritoryID
e ordenados logicamente por SalesYTD
. Isso significa que a função SUM é computada para cada território com base no ano de vendas. Para TerritoryID
1, há duas linhas para o ano de vendas de 2005 representando os dois vendedores com vendas naquele ano. O valor total acumulado de vendas para essas duas linhas é calculado e, em seguida, a terceira linha que representa as vendas para o ano de 2006 é incluída no cálculo.
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;
Veja a seguir o conjunto de resultados.
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)
Neste exemplo, a cláusula OVER não inclui PARTITION BY. Isso significa que a função será aplicada a todas as linhas retornadas pela consulta. A cláusula ORDER BY especificada na cláusula OVER determina a ordem lógica na qual a função SUM é aplicada. A consulta retorna um total cumulativo de vendas por ano para todos os territórios de vendas especificados na cláusula WHERE. A cláusula ORDER BY especificada na instrução SELECT determina a ordem na qual as linhas da consulta são exibidas.
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;
Veja a seguir o conjunto de resultados.
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)
Exemplos: Azure Synapse Analytics e PDW (Analytics Platform System)
C. Um exemplo simples de SUM
O exemplo a seguir retorna o número total de cada produto vendido no ano de 2003.
-- Uses AdventureWorks
SELECT ProductKey, SUM(SalesAmount) AS TotalPerProduct
FROM dbo.FactInternetSales
WHERE OrderDateKey >= '20030101'
AND OrderDateKey < '20040101'
GROUP BY ProductKey
ORDER BY ProductKey;
Este é um conjunto de resultados parcial.
ProductKey TotalPerProduct
---------- ---------------
214 31421.0200
217 31176.0900
222 29986.4300
225 7956.1500
D. Calculando totais de grupos com mais de uma coluna
O exemplo a seguir calcula a soma do ListPrice
e do StandardCost
para cada cor listada na tabela Product
.
-- Uses AdventureWorks
SELECT Color, SUM(ListPrice)AS TotalList,
SUM(StandardCost) AS TotalCost
FROM dbo.DimProduct
GROUP BY Color
ORDER BY Color;
A primeira parte do conjunto de resultados é mostrada abaixo:
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