Udostępnij za pomocą


SUM (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Punkt końcowy analizy SQL w usłudze Microsoft FabricHurtownia danych w usłudze Microsoft FabricBaza 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