Sdílet prostřednictvím


SUM (Transact-SQL)

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Koncový bod analýzy SQL v Microsoft FabricSklad v Microsoft FabricDatabáze SQL v Microsoft Fabric

Vrátí součet všech hodnot, nebo pouze DISTINCT hodnot, ve výrazu. SUM lze použít pouze s číselnými sloupci. Nulové hodnoty jsou ignorovány.

Transact-SQL konvence syntaxe

Syntaxe

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

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

Arguments

ALL

Použije agregační funkci na všechny hodnoty. ALL je výchozí.

ODLIŠNÝ

Specifikuje, že SUM vrací součet unikátních hodnot.

expression

Konstanta, sloupec nebo funkce a libovolná kombinace aritmetických, bitových a řetězcových operátorů. Výraz je výraz pro přesnou číselnou nebo aproximativní kategorii datových typů, s výjimkou datového typu bitu . Agregační funkce a poddotazy nejsou povolené. Další informace naleznete v tématu Výrazy.

KONEC ( [ partition_by_clause ] [ order_by_clause ] )

partition_by_clause rozdělí sadu výsledků vytvořenou FROM klauzulí na oddíly, na které se funkce použije. Pokud není zadáno, funkce zachází se všemi řádky sady výsledků dotazu jako s jednou skupinou.

order_by_clause určuje logické pořadí, ve kterém se operace provádí. Další informace naleznete v tématu SELECT - OVER klauzule.

Návratové typy

Vrací součet všech hodnot výrazu v nejpřesnějším datovém typu výrazu .

Výsledek výrazu Návratový typ
tinyint int
smallint int
int int
bigint bigint
Desetinná kategorie (P, S) desetinné (38, s)
Kategorie peněz a drobných peněz peníze
Floata reálná kategorie float

Poznámky

SUM je deterministická funkce při použití bez OVER klauzulí a ORDER BY klauzulí. Při zadání pomocí OVER klauzulí a ORDER BY klauzulí je nedeterministické. Další informace naleznete v tématu Deterministické a nedeterministické funkce.

Také se může chovat jako nedeterministická funkce, SUM když ji použijete s plovoucími a reálnými datovými typy. Základním důvodem je však přibližná povaha těchto datových typů.

Examples

Ukázky kódu v tomto článku používají ukázkovou databázi AdventureWorks2025 nebo AdventureWorksDW2025, kterou si můžete stáhnout z domovské stránky Microsoft SQL Serveru pro ukázky a komunitní projekty .

A. Použijte součet k vrácení souhrnných dat

Následující příklady ukazují použití funkce SUM pro vrácení souhrnných dat v databázi 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

Tady je soubor výsledků.

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

B. Použijte klauzuli o nadání

Následující příklad používá SUM funkci s klauzulí OVER k poskytnutí kumulativního součtu ročních prodejů pro každé území v tabulce Sales.SalesPerson v databázi AdventureWorks2025. Data jsou rozdělena a TerritoryID logicky uspořádána podle SalesYTD. To znamená, že SUM funkce se vypočítá pro každé území na základě prodejního roku. Pro TerritoryID první jsou dva řádky pro prodejní rok 2005, které představují dva prodejce s prodeji v daném roce. Kumulativní celková hodnota prodeje těchto dvou řádků se vypočítá a třetí řádek reprezentující prodeje za rok 2006 je zahrnut do výpočtu.

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;

Tady je soubor výsledků.

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

V tomto příkladu klauzule OVER neobsahuje PARTITION BY. To znamená, že funkce se použije na všechny řádky vrácené dotazem. Klauzule ORDER BY zadaná v klauzuli OVER určuje logické pořadí, ve kterém se použije SUM funkce. Dotaz vrací součet prodejů podle roku pro všechna prodejní území uvedená v klauzuli WHERE . Klauzule ORDER BY zadaná v příkazu SELECT určuje pořadí zobrazení řádků dotazu.

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;

Tady je soubor výsledků.

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

Příklady: Azure Synapse Analytics a Analytický platformový systém (PDW)

C. Jednoduchý příklad SUM

Následující příklad vrací celkový počet prodaných produktů v roce 2003.

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

Tady je částečná sada výsledků.

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

D. Vypočítejte součty skupin s více než jedním sloupcem

Následující příklad počítá součet ListPrice a StandardCost pro každou barvu uvedenou v tabulce Product .

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

První část množiny výsledků je zobrazena v následujících výsledcích:

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