Compartir a través de


SUM (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseInstancia administrada de Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Punto de conexión de SQL Analytics en Microsoft FabricAlmacén en Microsoft FabricBase de datos SQL en Microsoft Fabric

Devuelve la suma de todos los valores, o solo los DISTINCT valores, en la expresión. SUM solo puede usarse con columnas numéricas. Se omiten los valores NULL.

Convenciones de sintaxis de Transact-SQL

Sintaxis

-- Aggregate Function Syntax
SUM ( [ ALL | DISTINCT ] expression )

-- Analytic Function Syntax
SUM ( [ ALL ] expression) OVER ( [ partition_by_clause ] [ order_by_clause ] )

Argumentos

ALL

Aplica la función de agregado a todos los valores. ALL es el valor predeterminado.

DISTINCT

Especifica que SUM devuelve la suma de valores únicos.

expression

Constante, columna o función, y cualquier combinación de operadores aritméticos, bit a bit y de cadena. expression es una expresión de la categoría de tipos de datos numérico exacto o numérico aproximado, excepto para el tipo de datos bit. No se permiten funciones de agregado ni subconsultas. Para obtener más información, vea expresiones de .

CAMBIO ( [ partition_by_clause ] [ order_by_clause ] )

partition_by_clause divide el conjunto de resultados generado por la FROM cláusula en particiones a las que se aplica la función. Si no se especifica, la función trata todas las filas del conjunto de resultados de la consulta como un único grupo.

order_by_clause determina el orden lógico en el que se realiza la operación. Para obtener más información, vea CLÁUSULA SELECT - OVER.

Tipos de retorno

Devuelve la suma de todos los valores de expression en el tipo de datos de expression más preciso.

Resultado de la expresión Tipo de valor devuelto
tinyint int
smallint int
int int
bigint bigint
Categoría decimal (p, s) decimal(38, s)
Categorías money y smallmoney money
Categorías float y real float

Comentarios

SUM es una función determinista cuando se usa sin las OVER cláusulas y ORDER BY . No es determinista cuando se especifica con las OVER cláusulas y ORDER BY . Para más información, vea Funciones deterministas y no deterministas.

Además, SUM puede parecer que se comporta como una función no determinista cuando se usa con tipos de datos flotantes y reales . Pero la razón subyacente es la naturaleza aproximada de estos tipos de datos.

Ejemplos

Los ejemplos de código de este artículo usan la base de datos de ejemplo de AdventureWorks2025 o AdventureWorksDW2025, que puede descargar de la página principal de Ejemplos de Microsoft SQL Server y proyectos de comunidad.

A. Usar la suma para devolver los datos resumen

Los siguientes ejemplos muestran cómo se usan la función SUM para devolver datos resumen en la base de datos 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

Este es el conjunto de resultados.

Color
--------------- --------------------- ---------------------
Black           27404.84              5214.9616
Silver          26462.84              14665.6792
White           19.00                 6.7926

B. Utiliza la cláusula over

El siguiente ejemplo utiliza la SUM función con la OVER cláusula para proporcionar un total acumulativo de ventas anuales para cada territorio en la Sales.SalesPerson tabla de la base de datos AdventureWorks2025. Se crean particiones de los datos por TerritoryID y se ordenan lógicamente por SalesYTD. Esto significa que la SUM función se calcula para cada territorio en función del año de ventas. Para TerritoryID 1, hay dos filas para el año de ventas 2005 que representan a las dos personas de ventas con ventas ese año. El valor de ventas total acumulado para estas dos filas se calcula y, a continuación, la tercera fila que representa las ventas del año 2006 se incluye en el 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;

Este es el 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

En este ejemplo, la OVER cláusula no incluye PARTITION BY. Esto significa que la función se aplica a todas las filas devueltas por la consulta. La ORDER BY cláusula especificada en la OVER cláusula determina el orden lógico al que se aplica la SUM función. La consulta devuelve un total acumulado de ventas por año para todos los territorios de venta especificados en la WHERE cláusula. La ORDER BY cláusula especificada en la SELECT instrucción determina el orden en el que se muestran las filas de la consulta.

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;

Este es el 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

Ejemplos: Azure Synapse Analytics y Sistema de la plataforma de análisis (PDW)

C. Un sencillo ejemplo de SUM

En el siguiente ejemplo se devuelve el número total de cada producto vendido en el año 2003.

-- Uses AdventureWorks
SELECT ProductKey,
       SUM(SalesAmount) AS TotalPerProduct
FROM dbo.FactInternetSales
WHERE OrderDateKey >= '20030101'
      AND OrderDateKey < '20040101'
GROUP BY ProductKey
ORDER BY ProductKey;

A continuación se muestra un conjunto parcial de resultados.

ProductKey  TotalPerProduct
----------  ---------------
214         31421.0200
217         31176.0900
222         29986.4300
225          7956.1500

D. Calcular totales de grupo con más de una columna

En el siguiente ejemplo se calcula la suma de ListPrice y StandardCost por cada color que aparece en la tabla Product.

-- Uses AdventureWorks
SELECT Color,
       SUM(ListPrice) AS TotalList,
       SUM(StandardCost) AS TotalCost
FROM dbo.DimProduct
GROUP BY Color
ORDER BY Color;

La primera parte del conjunto de resultados se muestra en los siguientes 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