SUM (Transact-SQL)

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. Darauf folgt möglicherweise die OVER-Klausel (Transact-SQL).

Themenlink (Symbol) Transact-SQL-Syntaxkonventionen

Syntax

SUM ( [ ALL | DISTINCT ] expression )

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
    Dies ist eine Konstante, eine Spalte oder eine Funktion und eine beliebige Kombination aus arithmetischen, bitweisen und Zeichenfolgenoperatoren. expression ist ein Ausdruck der exakten numerischen oder ungefähren numerischen Datentypkategorie, mit Ausnahme des -Datentyps bit. Aggregatfunktionen und Unterabfragen sind nicht zulässig. Weitere Informationen finden Sie unter Ausdrücke (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)

Kategorien money und smallmoney

money

Kategorien float und real

float

Beispiele

A.Zurückgeben von Zusammenfassungsdaten mithilfe von SUM

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

USE AdventureWorks2012;
GO
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

Dies ist das Resultset.

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 kumulierten Gesamtbetrag des Jahresumsatzes für jedes Gebiet in der Sales.SalesPerson-Tabelle 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. Beachten Sie, dass für TerritoryID 1 zwei Zeilen für das Verkaufsjahr 2005 vorhanden sind, die die zwei Vertriebsmitarbeiter mit dem Umsatz aus diesem Jahr darstellen. Der kumulierte Umsatz für diese zwei Zeilen wird berechnet, und anschließend wird die dritte Zeile, die den Umsatz für das Jahr 2006 darstellt, in die Berechnung einbezogen.

USE AdventureWorks2012;
GO
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;

Dies ist das Resultset.

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 ist PARTITION BY nicht in der OVER-Klausel enthalten. Folglich wird die Funktion für 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;

Dies ist das Resultset.

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)

Siehe auch

Verweis

Aggregatfunktionen (Transact-SQL)

OVER-Klausel (Transact-SQL)