SUM (Transact-SQL)SUM (Transact-SQL)

SE APLICA A: síSQL Server síAzure SQL Database síAzure SQL Data Warehouse síAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Devuelve la suma de todos los valores o solo de los valores DISTINCT de la expresión.Returns the sum of all the values, or only the DISTINCT values, in the expression. SUM solo puede utilizarse con columnas numéricas.SUM can be used with numeric columns only. Se omiten los valores NULL.Null values are ignored.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

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

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

ArgumentosArguments

ALLALL
Aplica la función de agregado a todos los valores.Applies the aggregate function to all values. ALL es el valor predeterminado.ALL is the default.

DISTINCTDISTINCT
Especifica que SUM devuelve la suma de los valores únicos.Specifies that SUM returns the sum of unique values.

expressionexpression
Se trata de una constante, columna o función y cualquier combinación de operadores aritméticos, bit a bit y de cadena.Is a constant, column, or function, and any combination of arithmetic, bitwise, and string operators. 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.expression is an expression of the exact numeric or approximate numeric data type category, except for the bit data type. No se permiten funciones de agregado ni subconsultas.Aggregate functions and subqueries are not permitted. Para obtener más información, vea Expresiones (Transact-SQL).For more information, see Expressions (Transact-SQL).

OVER ( [ partition_by_clause ] order_by_clause )OVER ( [ partition_by_clause ] order_by_clause)
partition_by_clause divide el conjunto de resultados generado por la cláusula FROM en particiones a las que se aplica la función.partition_by_clause divides the result set produced by the FROM clause into partitions to which the function is applied. Si no se especifica, la función trata todas las filas del conjunto de resultados de la consulta como un único grupo.If not specified, the function treats all rows of the query result set as a single group. order_by_clause determina el orden lógico en el que se realiza la operación.order_by_clause determines the logical order in which the operation is performed. order_by_clause es obligatorio.order_by_clause is required. Para más información, vea Cláusula OVER (Transact-SQL).For more information, see OVER Clause (Transact-SQL).

Tipos devueltosReturn Types

Devuelve la suma de todos los valores de expression en el tipo de datos de expression más preciso.Returns the summation of all expression values in the most precise expression data type.

Resultado de la expresiónExpression result Tipo de valor devueltoReturn type
tinyinttinyint intint
smallintsmallint intint
intint intint
bigintbigint bigintbigint
Categoría decimal (p, s)decimal category (p, s) decimal(38, s)decimal(38, s)
Categorías money y smallmoneymoney and smallmoney category moneymoney
Categorías float y realfloat and real category floatfloat

NotasRemarks

SUM es una función determinista cuando se utiliza con las cláusulas OVER y ORDER BY.SUM is a deterministic function when used without the OVER and ORDER BY clauses. Es no determinista si se especifica con las cláusulas OVER y ORDER BY.It is nondeterministic when specified with the OVER and ORDER BY clauses. Para obtener más información, consulte Deterministic and Nondeterministic Functions.For more information, see Deterministic and Nondeterministic Functions.

EjemplosExamples

A.A. Usar SUM para devolver datos de resumenUsing SUM to return summary data

En los ejemplos siguientes se muestra cómo usar la función SUM para devolver datos de resumen de la base de datos AdventureWorks2012AdventureWorks2012.The following examples show using the SUM function to return summary data in the AdventureWorks2012AdventureWorks2012 database.

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  

El conjunto de resultados es el siguiente.Here is the result set.

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

(3 row(s) affected)

B.B. Usar la cláusula OVERUsing the OVER clause

En el ejemplo siguiente se usa la función SUM con la cláusula OVER para proporcionar un total acumulado de ventas anuales para cada territorio de la tabla Sales.SalesPerson de la base de datos AdventureWorks2012AdventureWorks2012.The following example uses the SUM function with the OVER clause to provide a cumulative total of yearly sales for each territory in the Sales.SalesPerson table in the AdventureWorks2012AdventureWorks2012 database. Se crean particiones de los datos por TerritoryID y se ordenan lógicamente por SalesYTD.The data is partitioned by TerritoryID and logically ordered by SalesYTD. Esto significa que la función SUM se calcula para cada territorio en función del año de ventas.This means that the SUM function is computed for each territory based on the sales year. Observe que para TerritoryID 1, solo hay dos filas para el año de ventas 2005, que representan los dos vendedores con ventas durante ese año.Notice that for TerritoryID 1, there are two rows for sales year 2005 representing the two sales people with sales that year. Se calculan las ventas totales acumuladas de estas dos filas y la tercera fila que representa las ventas durante el año 2006 se incluye en el cálculo.The cumulative sales total for these two rows is computed and then the third row representing sales for the year 2006 is included in the computation.

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;  

El conjunto de resultados es el siguiente.Here is the result set.

  
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)  
  

En este ejemplo, la cláusula OVER no incluye PARTITION BY.In this example, the OVER clause does not include PARTITION BY. Esto significa que la función se aplicará a todas las filas devueltas por la consulta.This means that the function will be applied to all rows returned by the query. La cláusula ORDER BY especificada en la cláusula OVER determina el orden lógico al que se aplica la función SUM.The ORDER BY clause specified in the OVER clause determines the logical order to which the SUM function is applied. La consulta devuelve un total acumulado de ventas por año para todos los territorios de ventas especificados en la cláusula WHERE.The query returns a cumulative total of sales by year for all sales territories specified in the WHERE clause. La cláusula ORDER BY especificada en la instrucción SELECT determina el orden en que se muestran las filas de la consulta.The ORDER BY clause specified in the SELECT statement determines the order in which the rows of the query are displayed.

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;  

El conjunto de resultados es el siguiente.Here is the result set.

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)  

Ejemplos: Almacenamiento de datos SQL de AzureAzure SQL Data Warehouse y Almacenamiento de datos paralelosParallel Data WarehouseExamples: Almacenamiento de datos SQL de AzureAzure SQL Data Warehouse and Almacenamiento de datos paralelosParallel Data Warehouse

C.C. Un sencillo ejemplo de SUMA simple SUM example

En el siguiente ejemplo se devuelve el número total de cada producto vendido en el año 2003.The following example returns the total number of each product sold in the year 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.Here is a partial result set.

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

D.D. Calcular totales de grupo con más de una columnaCalculating group totals with more than one column

En el siguiente ejemplo se calcula la suma de ListPrice y StandardCost por cada color que aparece en la tabla Product.The following example calculates the sum of the ListPrice and StandardCost for each color listed in the Product table.

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

Aquí se muestra la primera parte del conjunto de resultados:The first part of the result set is shown below:

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

Consulte tambiénSee Also

Funciones de agregado (Transact-SQL) Aggregate Functions (Transact-SQL)
OVER (cláusula de Transact-SQL)OVER Clause (Transact-SQL)