Condividi tramite


SUM (Transact-SQL)

Restituisce la somma di tutti i valori o solo dei valori DISTINCT dell'espressione. La funzione SUM può essere utilizzata solo con colonne numeriche. I valori Null vengono ignorati.

Si applica a: SQL Server (da SQL Server 2008 alla versione corrente), Database SQL di Windows Azure (dalla versione iniziale alla versione corrente).

Icona di collegamento a un argomento Convenzioni della sintassi Transact-SQL

Sintassi

SUM ( [ ALL | DISTINCT ] expression )
   OVER ( [ partition_by_clause ] order_by_clause )

Argomenti

  • ALL
    Applica la funzione di aggregazione a tutti i valori. Il valore predefinito è ALL.

  • DISTINCT
    Specifica che l'istruzione SUM restituisce la somma dei soli valori univoci.

  • expression
    Costante, colonna o funzione e qualsiasi combinazione di operatori aritmetici, bit per bit e stringa. expression è un'espressione della categoria di tipi di dati numerici esatti o numerici approssimati, ad eccezione del tipo di dati bit. Non è possibile utilizzare funzioni di aggregazione e sottoquery. Per ulteriori informazioni, vedere Espressioni (Transact-SQL).

  • OVER ( [ partition_by_clause ] order_by_clause**)**
    partition_by_clause suddivide il set di risultati generato dalla clausola FROM in partizioni alle quali viene applicata la funzione. Se non specificato, la funzione tratta tutte le righe del set di risultati della query come un unico gruppo. order_by_clause determina l'ordine logico in cui viene eseguita l'operazione. order_by_clause è obbligatorio. Per ulteriori informazioni, vedere Clausola OVER (Transact-SQL).

Tipi restituiti

Restituisce la somma di tutti i valori di expression nel tipo di dati di expression più preciso.

Risultato dell'espressione

Tipo restituito

tinyint

int

smallint

int

int

int

bigint

bigint

Categoria decimal (p, s)

decimal(38, s)

Categorie money e smallmoney

money

Categorie float e real

float

Osservazioni

SUM è una funzione deterministica quando viene utilizzato senza le clausole ORDER BY e OVER. Non è deterministica quando viene specificato con le clausole ORDER BY e OVER. Per ulteriori informazioni, vedere Funzioni deterministiche e non deterministiche.

Esempi

Negli esempi seguenti viene mostrato l'utilizzo della funzione SUM per restituire dati di riepilogo nel database AdventureWorks2012.

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

Set di risultati:

Color

--------------- --------------------- ---------------------

Black           27404.84              5214.9616

Silver          26462.84              14665.6792

White           19.00                 6.7926

(3 row(s) affected)

B.Utilizzo della clausola OVER

Nell'esempio seguente viene utilizzata la funzione SUM con la clausola OVER per fornire un totale cumulativo delle vendite annuali per ogni area presente nella tabella Sales.SalesPerson del database AdventureWorks2012. I dati vengono partizionati in base a TerritoryID e ordinati logicamente in base a SalesYTD. La funzione SUM viene pertanto calcolata per ogni area in base all'anno di vendita. Si noti che per TerritoryID 1, sono presenti due righe per l'anno di vendita 2005, a indicare due venditori con vendite in tale anno. Vengono calcolate le vendite cumulative delle due righe e nel calcolo viene quindi inclusa la terza riga che rappresenta le vendite per l'anno 2006.

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;

Set di risultati:

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)

In questo esempio la clausola OVER non include PARTITION BY. La funzione verrà pertanto applicata a tutte le righe restituite dalla query. La clausola ORDER BY specificata nella clausola OVER determina l'ordine logico in base al quale viene applicata la funzione SUM. La query restituisce un totale cumulativo delle vendite annuali per tutte le aree di vendita specificate nella clausola WHERE. La clausola ORDER BY specificata nell'istruzione SELECT determina l'ordine in cui vengono visualizzate le righe della query.

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;

Set di risultati:

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)

Vedere anche

Riferimento

Funzioni di aggregazione (Transact-SQL)

Clausola OVER (Transact-SQL)