SUM (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalysplattformssystem (PDW)SQL-analysslutpunkt i Microsoft FabricLager i Microsoft FabricSQL-databas i Microsoft Fabric

Returnerar summan av alla värden, eller endast värdena DISTINCT , i uttrycket. SUM kan endast användas med numeriska kolumner. Nollvärden ignoreras.

Transact-SQL syntaxkonventioner

Syntax

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

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

Arguments

ALL

Tillämpar aggregeringsfunktionen på alla värden. ALL används som standard.

SÄRSKILD

Specificerar att SUM returnerar summan av unika värden.

uttryck

En konstant, kolumn eller funktion, och en kombination av aritmetik, bitvis, och strängoperatorer. uttryck är ett uttryck av den exakta numeriska eller approximativa numeriska datatypkategorin, förutom bitdatatypen . Mängdfunktioner och underfrågor är inte tillåtna. Mer information finns i Uttryck.

ÖVER ( [ partition_by_clause ] [ order_by_clause ] )

partition_by_clause delar upp resultatuppsättningen FROM som genereras av -satsen i partitioner som funktionen tillämpas på. Om det inte anges behandlar funktionen alla rader i frågeresultatuppsättningen som en enda grupp.

order_by_clause avgör i vilken logisk ordning åtgärden utförs. Mer information finns i SELECT - OVER-satsen.

Returtyper

Returnerar summan av alla uttrycksvärden i den mest precisa uttrycksdatatypen .

Uttrycksresultat Returtyp
tinyint int
smallint int
int int
bigint bigint
Decimalkategori (P, S) Decimal(38, s)
Kategori pengar och småpengar pengar
Flytt och reell kategori float

Anmärkningar

SUM är en deterministisk funktion när den OVER används utan - och-satserna ORDER BY . Det är icke-terministiskt när det OVER anges med - och-satserna ORDER BY . Mer information finns i deterministiska och icke-terministiska funktioner.

Det kan också SUM verka som en icke-deterministisk funktion när du använder det med flyttal- och realdatatyper . Men den underliggande orsaken är den ungefärliga naturen hos dessa datatyper.

Examples

Kodexemplen i den här artikeln använder AdventureWorks2025- eller AdventureWorksDW2025-exempeldatabasen, som du kan ladda ned från startsidan Microsoft SQL Server Samples och Community Projects.

A. Använd summan för att returnera sammanfattningsdata

Följande exempel visar hur man använder SUM-funktionen för att returnera sammanfattningsdata i AdventureWorks2025-databasen.

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

Här är resultatet.

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

B. Använd översatsen

Följande exempel använder SUM funktionen med klausulen OVER för att ge en kumulativ total årlig försäljning för varje territorium i Sales.SalesPerson tabellen i AdventureWorks2025-databasen. Datan är uppdelad med TerritoryID och logiskt ordnad efter SalesYTD. Det innebär att funktionen SUM beräknas för varje område baserat på försäljningsåret. För TerritoryID det första finns det två rader för försäljningsåret 2005 som representerar de två säljarna med försäljning det året. Det kumulativa totala försäljningsvärdet för dessa två rader beräknas och sedan inkluderas den tredje raden som representerar försäljning för år 2006 i beräkningen.

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;

Här är resultatet.

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

I det här exemplet innehåller OVER-satsen inte PARTITION BY. Det innebär att funktionen tillämpas på alla rader som returneras av frågan. Den ORDER BY-sats som anges i OVER-satsen avgör den logiska ordning som funktionen SUM tillämpas på. Frågan returnerar en kumulativ total försäljning per år för alla försäljningsområden som anges i klausulen WHERE . Den ORDER BY-sats som anges i SELECT-instruktionen avgör i vilken ordning frågans rader visas.

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;

Här är resultatet.

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

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

C. Ett enkelt SUM-exempel

Följande exempel visar det totala antalet sålda produkter år 2003.

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

Här är en partiell resultatuppsättning.

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

D. Beräkna gruppsummor med mer än en kolumn

Följande exempel beräknar summan av ListPrice och StandardCost för varje färg som listas i Product tabellen.

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

Den första delen av resultatuppsättningen visas i följande resultat:

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