Delen via


SUM (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Analytics-eindpunt in Microsoft FabricMagazijn in Microsoft FabricSQL-database in Microsoft Fabric

Geeft de som van alle waarden, of alleen de DISTINCT waarden, in de expressie terug. SUM kan alleen met numerieke kolommen worden gebruikt. Nulwaarden worden genegeerd.

Transact-SQL syntaxis-conventies

Syntaxis

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

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

Arguments

ALL

Hiermee past u de statistische functie toe op alle waarden. ALL is de standaardwaarde.

ONDERSCHEIDEND

Specificeert dat SUM de som van unieke waarden teruggeeft.

expressie

Een constante, kolom of functie, en elke combinatie van rekenkundige, bitgewijze en stringoperatoren. expressie is een uitdrukking van de exacte numerieke of benaderende numerieke datatypecategorie, behalve voor het bitdatatype . Statistische functies en subquery's zijn niet toegestaan. Zie Expressies voor meer informatie.

OVER ( [ partition_by_clause ] [ order_by_clause ] )

partition_by_clause verdeelt de resultatenset die door de FROM component wordt geproduceerd in partities waarop de functie wordt toegepast. Als deze niet is opgegeven, behandelt de functie alle rijen van de queryresultatenset als één groep.

order_by_clause bepaalt de logische volgorde waarin de bewerking wordt uitgevoerd. Zie SELECT - OVER-component voor meer informatie.

Retourtypen

Geeft de som van alle expressiewaarden terug in het meest precieze expressiedatatype .

Expressieresultaat Resultaattype
tinyint int
smallint int
int int
bigint bigint
Decimale categorie (P, S) Decimaal(38, s)
Geld- en kleingeldcategorie geld
float en reële categorie float

Opmerkingen

SUM is een deterministische functie wanneer deze wordt gebruikt zonder de OVER en ORDER BY componenten. Het is niet-deterministisch wanneer deze is opgegeven met de OVER en ORDER BY componenten. Zie Deterministische en niet-deterministische functiesvoor meer informatie.

Ook kan het lijken SUM alsof het een niet-deterministische functie is wanneer je het gebruikt met float- en real datatypes. Maar de onderliggende reden is de benaderende aard van deze datatypen.

Voorbeelden

De codevoorbeelden in dit artikel gebruiken de AdventureWorks2025 of AdventureWorksDW2025 voorbeelddatabase die u kunt downloaden van de startpagina van Microsoft SQL Server Samples en Community Projects .

Eén. Gebruik som om samenvattende gegevens terug te geven

De volgende voorbeelden tonen het gebruik van de SUM-functie om samenvattende gegevens terug te geven in de AdventureWorks2025-database.

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 is het resultatenoverzicht.

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

B. Gebruik de over-clausule

Het volgende voorbeeld gebruikt de SUM functie met de OVER clausule om een cumulatief totaal van jaarlijkse verkopen voor elk gebied in de Sales.SalesPerson tabel in de AdventureWorks2025-database te geven. De gegevens zijn gepartitioneerd door TerritoryID en logisch geordend door SalesYTD. Dit betekent dat de functie SUM wordt berekend voor elk gebied op basis van het verkoopjaar. Ten TerritoryID eerste zijn er twee rijen voor verkoopjaar 2005 die de twee verkopers met verkopen dat jaar vertegenwoordigen. De cumulatieve totale verkoopwaarde voor deze twee rijen wordt berekend en vervolgens wordt de derde rij die de verkoop voor het jaar 2006 vertegenwoordigt meegenomen in de berekening.

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 is het resultatenoverzicht.

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 dit voorbeeld bevat de OVER-component geen PARTITION BY. Dit betekent dat de functie wordt toegepast op alle rijen die door de query worden geretourneerd. De ORDER BY-component die is opgegeven in de OVER-component bepaalt de logische volgorde waarop de SUM functie wordt toegepast. De zoekopdracht levert een cumulatief totaal van de verkopen per jaar op voor alle verkoopgebieden die in de WHERE clausule zijn gespecificeerd. De ORDER BY component die is opgegeven in de instructie SELECT bepaalt de volgorde waarin de rijen van de query worden weergegeven.

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 is het resultatenoverzicht.

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

Voorbeelden: Azure Synapse Analytics and Analytics Platform System (PDW)

C. Een eenvoudig SUM-voorbeeld

Het volgende voorbeeld geeft het totale aantal verkochte producten in het jaar 2003 weer.

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

Hier volgt een gedeeltelijke resultatenset.

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

D. Bereken groepstotalen met meer dan één kolom

Het volgende voorbeeld berekent de som van de ListPrice en StandardCost voor elke kleur die in de Product tabel wordt vermeld.

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

Het eerste deel van de resultaatset wordt weergegeven in de volgende resultaten:

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