Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Si applica a:SQL Server
Database SQL di Azure
Istanza gestita di SQL di Azure
Azure Synapse Analytics
Piattaforma di analisi (PDW)
Endpoint di analisi SQL in Microsoft Fabric
Magazzino in Microsoft Fabric
Database SQL in Microsoft Fabric
Restituisce la somma di tutti i valori, o solo dei DISTINCT valori, nell'espressione.
SUM può essere usato 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.
ALL è l'impostazione predefinita.
DISTINCT
Specifica che SUM restituisce la somma dei valori unici.
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.
CAMBIO ( [ partition_by_clause ] [ order_by_clause ] )
partition_by_clause divide il set di risultati prodotto dalla FROM clausola in partizioni a cui 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. Per altre informazioni, vedere clausola SELECT - OVER.
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 se utilizzata senza le OVER clausole e ORDER BY . È non deterministico se specificato con le OVER clausole e ORDER BY . Per altre informazioni, vedere Funzioni deterministiche e non deterministiche.
Inoltre, SUM potrebbe sembrare una funzione non deterministica quando la usi con tipi di dati float e reali . Ma il motivo sottostante è la natura approssimativa di questi tipi di dati.
Esempi
Gli esempi di codice in questo articolo usano il database di esempio AdventureWorks2025 o AdventureWorksDW2025, che è possibile scaricare dalla home page Microsoft SQL Server Samples and Community Projects.
R. Usa la somma per restituire i dati riassuntivi
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
B. Usa la clausola over
Il seguente esempio utilizza la SUM funzione con la OVER clausola per fornire un totale cumulativo delle vendite annuali per ciascun territorio nella Sales.SalesPerson tabella del database AdventureWorks2022. I dati vengono partizionati in base a TerritoryID e ordinati logicamente in base a SalesYTD. Ciò significa che la SUM funzione viene calcolata per ogni territorio 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
In questo esempio la OVER clausola non include PARTITION BY. Ciò significa che la funzione viene applicata a tutte le righe restituite dalla query. La ORDER BY clausola specificata nella OVER clausola determina l'ordine logico a cui viene applicata la SUM funzione. La query restituisce un totale cumulativo delle vendite per anno per tutti i territori di vendita specificati nella WHERE clausola. La ORDER BY clausola specificata nell'istruzione determina l'ordine SELECT 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
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. Calcolare i totali di gruppo 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 dell'insieme di risultati è mostrata nei seguenti risultati:
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