SUM (Transact-SQL)

Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics Piattaforma di strumenti analitici (PDW) Endpoint di analisi SQL in Microsoft Fabric Warehouse in Microsoft Fabric

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.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

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

-- Analytic Function Syntax
SUM ( [ ALL ] 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 stringhe. expression è un'espressione della categoria dei tipi di dati numerici esatti o numerici approssimativi, ad eccezione del tipo di dati bit. Le funzioni di aggregazione e le sottoquery non sono consentite. Per altre 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 altre informazioni, vedere Clausola OVER (Transact-SQL).

Tipi restituiti

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

Risultato dell'espressione Tipo restituito
tinyint int
smallint int
int int
bigint bigint
Categoria decimal (p, s) decimal (38, s)
Categoria money e smallmoney money
Categoria float e real float

Osservazioni:

SUM è una funzione deterministica quando viene utilizzato senza le clausole ORDER BY e OVER. È non deterministico se specificato con le clausole OVER e ORDER BY. Per altre informazioni, vedere Funzioni deterministiche e non deterministiche. Inoltre, SUM potrebbe sembrare di comportarsi come una funzione non deterministica quando viene usata con tipi di dati float e reali . Ma il motivo sottostante è la natura approssimativa di questi tipi di dati.

Esempi

R. Utilizzo di SUM per restituire dati di riepilogo

Negli esempi seguenti viene illustrato l'utilizzo della funzione SUM per restituire i dati di riepilogo nel database AdventureWorks2022.

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

Il set di risultati è il seguente.

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 territorio nella Sales.SalesPerson tabella del database AdventureWorks2022. 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. Per TerritoryID 1, sono presenti due righe per l'anno di vendita 2005 che rappresentano le due persone di vendita con vendite quell'anno. Il valore totale delle vendite cumulativo per queste due righe viene calcolato e la terza riga che rappresenta le vendite per l'anno 2006 viene inclusa nel calcolo.

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;

Il set di risultati è il seguente.

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;

Il set di risultati è il seguente.

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)

Esempi: Azure Synapse Analytics e Piattaforma di strumenti analitici (PDW)

C. Esempio di SUM semplice

L'esempio seguente restituisce il numero totale di ogni prodotto venduto nell'anno 2003.

-- Uses AdventureWorks

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

Di seguito è riportato un set di risultati parziale.

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

D. Calcolo dei totali di gruppi con più di una colonna

Nell'esempio seguente viene calcolata la somma di ListPrice e StandardCost per ogni colore incluso nella tabella Product.

-- Uses AdventureWorks

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

La prima parte del set di risultati è illustrata sotto:

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