Compartilhar via


SUM (Transact-SQL)

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureAzure Synapse AnalyticsAnalytics Platform System (PDW)Ponto de extremidade de análise de SQL no Microsoft FabricDepósito no Microsoft FabricBanco de dados SQL no Microsoft Fabric

Retorna a soma de todos os valores, ou apenas dos DISTINCT valores, na expressão. SUM pode ser usado apenas 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 dos valores únicos.

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, consulte Expressions.

ENCERRADO ( [ 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 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. Para obter mais informações, consulte a cláusula SELECT - OVER.

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 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, confira Funções determinísticas e não determinísticas.

Além disso, SUM pode parecer agir como uma função não determinística quando você a usa com tipos de dados float e reais . Mas o motivo subjacente é a natureza aproximada desses tipos de dados.

Exemplos

Os exemplos de código neste artigo usam o banco de dados de exemplo AdventureWorks2025 ou AdventureWorksDW2025, que você pode baixar na página inicial Microsoft SQL Server Samples and Community Projects.

a. Use a soma para devolver dados resumo

Os exemplos a seguir mostram o uso da função SUM para retornar dados resumidos no banco 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

Veja a seguir 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 a seguir usa 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 do banco de dados AdventureWorks2025. Os dados são particionados por TerritoryID e ordenados logicamente por SalesYTD. Isso significa que a SUM função é calculada 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

Neste exemplo, a OVER cláusula não inclui PARTITION BY. Isso significa que a função é aplicada a todas as linhas retornadas pela consulta. A ORDER BY cláusula especificada na OVER cláusula determina a ordem lógica à qual a SUM função é aplicada. A consulta retorna um total cumulativo de vendas por ano para todos os territórios de vendas especificados na WHERE cláusula. A ORDER BY cláusula especificada na SELECT instrução 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

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. Calcule 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 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