Freigeben über


SUM (Transact-SQL)

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) SQL Analytics-Endpunkt in Microsoft Fabric Warehouse in Microsoft Fabric

Gibt die Summe aller Werte oder nur der DISTINCT-Werte im Ausdruck zurück. SUM kann nur bei numerischen Spalten verwendet werden. NULL-Werte werden ignoriert.

Transact-SQL-Syntaxkonventionen

Syntax

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

-- Analytic Function Syntax
SUM ( [ ALL ] expression) OVER ( [ partition_by_clause ] order_by_clause)

Argumente

ALL

Wendet die Aggregatfunktion auf alle Werte an. ALL ist die Standardeinstellung.

DISTINCT

Gibt an, dass SUM die Summe der eindeutigen Werte zurückgibt.

expression

Eine Konstante, Spalte oder Funktion sowie eine beliebige Kombination aus arithmetischen, bitweisen und Zeichenfolgenoperatoren. Bei expression handelt es sich um einen Ausdruck der genauen numerischen oder ungefähren numerischen Datentypkategorie, mit Ausnahme des bit-Datentyps. Aggregatfunktionen und Unterabfragen sind nicht zulässig. Weitere Informationen finden Sie unter Ausdrücke (Transact-SQL).

OVER ( [ partition_by_clause ] order_by_clause)

partition_by_clause unterteilt das von der FROM-Klausel erzeugte Resultset in Partitionen, auf die die Funktion angewendet wird. Wird dies nicht angegeben, verarbeitet die Funktion alle Zeilen des Abfrageresultsets als einzelne Gruppe. order_by_clause bestimmt die logische Reihenfolge, in der der Vorgang ausgeführt wird. order_by_clause ist erforderlich. Weitere Informationen finden Sie unter OVER-Klausel (Transact-SQL).

Rückgabetypen

Gibt die Summe aller expression-Werte im genauesten expression-Datentyp zurück.

Ausdrucksergebnis Rückgabetyp
tinyint int
smallint int
int int
bigint bigint
decimal-Kategorie (p, s) decimal(38, s)
money- und smallmoney-Kategorie money
float- und real-Kategorie float

Hinweise

SUM ist eine deterministische Funktion, wenn sie ohne die OVER- und ORDER BY-Klauseln angegeben wird. Sie ist nicht deterministisch, wenn sie mit den KLAUSELn OVER und ORDER BY angegeben wird. Weitere Informationen finden Sie unter Deterministic and Nondeterministic Functions. Darüber hinaus verhält sich SUMME möglicherweise als nicht deterministische Funktion, wenn Sie sie mit float- und realen Datentypen verwenden. Der zugrunde liegende Grund ist jedoch die ungefähre Art dieser Datentypen.

Beispiele

A. Zurückgeben von Zusammenfassungsdaten mithilfe von SUM

Die folgenden Beispiele zeigen, wie Sie mit der SUM-Funktion Zusammenfassungsdaten in der AdventureWorks2022-Datenbank zurückgeben.

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

Hier sehen Sie das Ergebnis.

Color
--------------- --------------------- ---------------------
Black           27404.84              5214.9616
Silver          26462.84              14665.6792
White           19.00                 6.7926

(3 row(s) affected)

B. Verwenden der OVER-Klausel

Im folgenden Beispiel wird die SUM-Funktion mit der OVER-Klausel verwendet, um einen kumulativen Gesamtwert der Jahresumsätze für jedes Gebiet in der Sales.SalesPerson-Tabelle der AdventureWorks2022-Datenbank bereitzustellen. Die Daten werden nach TerritoryID partitioniert und logisch nach SalesYTD sortiert. Folglich wird die SUM-Funktion auf Grundlage des Verkaufsjahres für jedes Gebiet berechnet. Für TerritoryID 1 gibt es zwei Zeilen für das Umsatzjahr 2005, die die beiden Vertriebsmitarbeiter mit dem Umsatz in diesem Jahr darstellen. Der kumulierte Gesamtumsatzwert für diese beiden Zeilen wird berechnet, und dann wird die dritte Zeile, die den Umsatz für das Jahr 2006 darstellt, in die Berechnung einbezogen.

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;

Hier sehen Sie das Ergebnis.

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 diesem Beispiel enthält die OVER-Klausel keine PARTITION BY. Folglich wird die Funktion auf alle von der Abfrage zurückgegebenen Zeilen angewendet. Die in der OVER-Klausel angegebene ORDER BY-Klausel bestimmt die logische Reihenfolge, für die die SUM-Funktion übernommen wird. Die Abfrage gibt einen kumulierten Gesamtumsatz nach Jahr für alle Vertriebsgebiete zurück, die in der WHERE-Klausel angegeben sind. Die in der SELECT-Anweisung angegebene ORDER BY-Klausel bestimmt die Reihenfolge, in der die Zeilen der Abfrage angezeigt werden.

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;

Hier sehen Sie das Ergebnis.

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)

Beispiele: Azure Synapse Analytics und Analytics-Plattformsystem (PDW)

C. Ein einfaches SUM-Beispiel

Im folgenden Beispiel wird die Gesamtanzahl der einzelnen verkauften Produkte im Jahr 2003 zurückgegeben.

-- Uses AdventureWorks

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

Dies ist ein Auszug aus dem Resultset.

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

D: Berechnen von Gesamtsummen für Gruppen mit mehr als einer Spalte

Im folgenden Beispiel wird die Summe von ListPrice und StandardCost für jede in der Product-Tabelle aufgeführte Farbe berechnet.

-- Uses AdventureWorks

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

Der erste Teil des Resultsets wird im Folgenden dargestellt:

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