Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Base de Dados SQL do Azure
Instância Gerida do Azure SQL
Azure Synapse Analytics
Sistema de Plataforma de Análise (PDW)
Ponto de Extremidade de Análise SQL no Microsoft Fabric
Armazém no Microsoft Fabric
Base de Dados SQL no Microsoft Fabric
Devolve a soma de todos os valores, ou apenas dos DISTINCT valores, na expressão.
SUM pode ser usado apenas com colunas numéricas. Os valores nulos são ignorados.
Transact-SQL convenções de sintaxe
Sintaxe
-- Aggregate Function Syntax
SUM ( [ ALL | DISTINCT ] expression )
-- Analytic Function Syntax
SUM ( [ ALL ] expression) OVER ( [ partition_by_clause ] [ order_by_clause ] )
Arguments
ALL
Aplica a função de agregação a todos os valores.
ALL é o padrão.
DISTINTO
Especifica que SUM devolve a soma dos valores únicos.
expressão
Uma constante, coluna ou função, e qualquer combinação de operadores aritméticos, bit a bit e de cadeia. Expressão é uma expressão do tipo de dado numérico exato ou numérico aproximado, exceto para o tipo de dado bit . Funções agregadas e subconsultas não são permitidas. Para obter mais informações, consulte Expressões.
MAIS ( [ partition_by_clause ] [ order_by_clause ] )
partition_by_clause divide o conjunto de resultados produzido pela FROM cláusula em partições às quais a função é aplicada. Se não for especificada, a função trata todas as linhas do conjunto de resultados da consulta como um único grupo.
order_by_clause determina a ordem lógica em que a operação é executada. Para obter mais informações, consulte Cláusula SELECT - OVER.
Tipos de devolução
Devolve a soma de todos os valores de expressão no tipo de dado de expressão mais preciso.
| Resultado da expressão | Tipo de retorno |
|---|---|
| tinyint | int |
| smallint | int |
| int | int |
| bigint | bigint |
| Categoria decimal (P, S) | decimal(38, s) |
| Moeda e categoria de dinheiro pequeno | dinheiro |
| Flutuante e categoria real | float |
Observações
SUM é uma função determinística quando usada sem as OVER cláusulas e ORDER BY . É não determinístico quando especificado com as OVER cláusulas e ORDER BY . Para obter mais informações, consulte Funções determinísticas e não determinísticas.
Além disso, SUM pode parecer comportar-se como uma função não determinística quando se usa com tipos de dados float e reais . Mas a razão subjacente é a natureza aproximada destes tipos de dados.
Examples
Os exemplos de código neste artigo usam o banco de dados de exemplo AdventureWorks2025 ou AdventureWorksDW2025, que pode ser descarregado da página inicial de Exemplos e Projetos da Comunidade do Microsoft SQL Server.
A. Use a soma para devolver dados resumo
Os exemplos seguintes mostram a utilização da função SUM para devolver dados de resumo na base de dados 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
Aqui está o conjunto de resultados.
Color
--------------- --------------------- ---------------------
Black 27404.84 5214.9616
Silver 26462.84 14665.6792
White 19.00 6.7926
B. Use a cláusula over
O exemplo seguinte utiliza a SUM função com a OVER cláusula para fornecer um total cumulativo das vendas anuais para cada território na Sales.SalesPerson tabela da base de dados AdventureWorks2025. Os dados são particionados por TerritoryID e ordenados logicamente por SalesYTD. Isto significa que a função SUM é calculada para cada território com base no ano de vendas. Para TerritoryID o 1, existem duas linhas para o ano de vendas de 2005, representando os dois vendedores com vendas desse ano. O valor total acumulado de vendas para estas duas linhas é calculado e depois a terceira linha que representa as vendas do 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;
Aqui está 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
Neste exemplo, a cláusula OVER não inclui PARTITION BY. Isso significa que a função é aplicada a todas as linhas retornadas pela consulta. A cláusula ORDER BY especificada na cláusula OVER determina a ordem lógica à qual a função SUM é aplicada. A consulta devolve um total cumulativo de vendas por ano para todos os territórios de vendas especificados na WHERE cláusula. A cláusula ORDER BY especificada na instrução SELECT determina a ordem em que 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;
Aqui está 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
Exemplos: Azure Synapse Analytics and Analytics Platform System (PDW)
C. Um exemplo simples de SUM
O exemplo seguinte devolve 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;
Aqui está um conjunto de resultados parciais.
ProductKey TotalPerProduct
---------- ---------------
214 31421.0200
217 31176.0900
222 29986.4300
225 7956.1500
D. Calcular totais de grupo com mais do que uma coluna
O exemplo seguinte calcula a soma dos ListPrice e StandardCost para cada cor listada na Product tabela.
-- 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 nos seguintes resultados:
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