Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Punkt końcowy analizy SQL w usłudze Microsoft Fabric
Hurtownia danych w usłudze Microsoft Fabric
Baza danych SQL w usłudze Microsoft Fabric
Zwraca sumę wszystkich wartości lub tylko DISTINCT wartości w wyrażeniu.
SUM można używać wyłącznie kolumn numerycznych. Wartości zerowe są ignorowane.
Transact-SQL konwencje składni
Składnia
-- Aggregate Function Syntax
SUM ( [ ALL | DISTINCT ] expression )
-- Analytic Function Syntax
SUM ( [ ALL ] expression) OVER ( [ partition_by_clause ] [ order_by_clause ] )
Arguments
ALL
Stosuje funkcję agregacji do wszystkich wartości.
ALL jest wartością domyślną.
ODMIENNY
Określa, że SUM zwraca sumę unikalnych wartości.
expression
Stała, kolumna lub funkcja oraz dowolna kombinacja operatorów arytmetycznych, bitowych i ciągów znaków. wyrażenie jest wyrażeniem dokładnej kategorii numerycznej lub przybliżonej kategorii danych numerycznych, z wyjątkiem typu danych bitowych . Funkcje agregujące i podzapytania nie są dozwolone. Aby uzyskać więcej informacji, zobacz Wyrażenia.
KONIEC ( [ partition_by_clause ] [ order_by_clause ] )
partition_by_clause dzieli zestaw wyników generowany przez klauzulę FROM na partycje, do których jest stosowana funkcja. Jeśli nie zostanie określony, funkcja traktuje wszystkie wiersze zestawu wyników zapytania jako pojedynczą grupę.
order_by_clause określa kolejność logiczną, w której jest wykonywana operacja. Aby uzyskać więcej informacji, zobacz SELECT — OVER, klauzula.
Typy zwracane
Zwraca sumę wszystkich wartości wyrażeń w najbardziej precyzyjnym typie danych wyrażeń .
| Wynik wyrażenia | Typ zwracany |
|---|---|
| tinyint | int |
| smallint | int |
| int | int |
| bigint | bigint |
| Kategoria dziesiętna (P, S) | dziesiętny(38, s) |
| Kategoria pieniędzy i drobnych pieniędzy | pieniędzy |
| Kategoria float i rzeczywiste | float |
Uwagi
SUM jest funkcją deterministyczną, gdy jest używana bez OVER klauzul i ORDER BY . Jest to niedeterministyczne, gdy jest określony z klauzulami OVER i ORDER BY . Aby uzyskać więcej informacji, zobacz funkcje deterministyczne i niedeterministyczne.
Może też wydawać się SUM działać jako funkcja niedeterministyczna, gdy używasz go z float i rzeczywistymi typami danych. Ale podstawowym powodem jest przybliżony charakter tych typów danych.
Przykłady
Przykłady kodu w tym artykule korzystają z przykładowej bazy danych AdventureWorks2025 lub AdventureWorksDW2025, którą można pobrać ze strony głównej Przykładów programu Microsoft SQL Server i projektów społeczności.
A. Użyj sumy do zwracania danych podsumowanych
Poniższe przykłady pokazują użycie funkcji SUM do zwracania danych podsumowujących w bazie 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
Oto zestaw wyników.
Color
--------------- --------------------- ---------------------
Black 27404.84 5214.9616
Silver 26462.84 14665.6792
White 19.00 6.7926
B. Użyj klauzuli over
Poniższy przykład wykorzystuje SUM funkcję z klauzulą OVER do przedstawienia łącznej liczby rocznych sprzedaży dla każdego terytorium w tabeli Sales.SalesPerson bazy AdventureWorks2025. Dane są podzielone przez i TerritoryID logicznie uporządkowane przez .SalesYTD Oznacza to, że funkcja SUM jest obliczana dla każdego terytorium na podstawie roku sprzedaży. Po TerritoryID pierwsze, są dwa wiersze dla roku sprzedaży 2005, reprezentujące dwóch sprzedawców z sprzedażą w tym roku. Obliczana jest łączna wartość sprzedaży tych dwóch wierszy, a następnie trzeci wiersz reprezentujący sprzedaż za rok 2006 jest uwzględniany w obliczeniach.
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;
Oto zestaw wyników.
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
W tym przykładzie klauzula OVER nie zawiera PARTITION BY. Oznacza to, że funkcja jest stosowana do wszystkich wierszy zwracanych przez zapytanie. Klauzula ORDER BY określona w klauzuli OVER określa kolejność logiczną, do której jest stosowana funkcja SUM. Zapytanie zwraca łączną liczbę sprzedaży według lat dla wszystkich obszarów sprzedaży określonych w klauzuli WHERE . Klauzula ORDER BY określona w instrukcji SELECT określa kolejność wyświetlania wierszy zapytania.
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;
Oto zestaw wyników.
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
Przykłady: Azure Synapse Analytics and Analytics Platform System (PDW)
C. Prosty przykład SUM
Poniższy przykład zwraca łączną liczbę sprzedanych produktów w roku 2003.
-- Uses AdventureWorks
SELECT ProductKey,
SUM(SalesAmount) AS TotalPerProduct
FROM dbo.FactInternetSales
WHERE OrderDateKey >= '20030101'
AND OrderDateKey < '20040101'
GROUP BY ProductKey
ORDER BY ProductKey;
Oto zestaw wyników częściowych.
ProductKey TotalPerProduct
---------- ---------------
214 31421.0200
217 31176.0900
222 29986.4300
225 7956.1500
D. Oblicz sumy grupowe z więcej niż jedną kolumną
Poniższy przykład oblicza sumę i ListPrice dla StandardCost każdego koloru wymienionego w tabeli Product .
-- Uses AdventureWorks
SELECT Color,
SUM(ListPrice) AS TotalList,
SUM(StandardCost) AS TotalCost
FROM dbo.DimProduct
GROUP BY Color
ORDER BY Color;
Pierwsza część zbioru wyników przedstawiona jest w następujących wynikach:
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
Treści powiązane
- funkcje agregujące (Transact-SQL)
- SELECT — klauzula OVER (Transact-SQL)