Aracılığıyla paylaş


SUM (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAzure Synapse AnalyticsAnaliz Platformu Sistemi (PDW)Microsoft Fabric'teki SQL analiz uç noktasıMicrosoft Fabric'teki ambarMicrosoft Fabric'teki SQL veritabanı

İfadedeki tüm değerlerin toplamını veya sadece DISTINCT değerleri döndürür. SUM yalnızca sayısal sütunlarla kullanılabilir. Null değerler göz ardı edilir.

Transact-SQL söz dizimi kuralları

Sözdizimi

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

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

Arguments

HEPSİ

Toplama işlevini tüm değerlere uygular. ALL varsayılan değerdir.

BELİRGİN

Benzersiz değerlerin toplamını döndürdüğünü belirtir SUM .

expression

Bir sabit, sütun veya fonksiyon ve aritmetik, bit bazında ve dizi operatörlerinin herhangi bir kombinasyonu. İfade , bit veri türü hariç, tam sayısal veya yaklaşık sayısal veri tipi kategorisinin bir ifadesidir. Toplama işlevlerine ve alt sorgulara izin verilmez. Daha fazla bilgi için bkz . İfadeler.

OVER ( [ partition_by_clause ] [ order_by_clause ] )

partition_by_clause yan tümcesi tarafından FROM üretilen sonuç kümesini işlevin uygulandığı bölümlere böler. Belirtilmezse, işlev sorgu sonuç kümesinin tüm satırlarını tek bir grup olarak ele alır.

order_by_clause işlemin gerçekleştirildiği mantıksal sırayı belirler. Daha fazla bilgi için bkz. SELECT - OVER yan tümcesi.

Dönüş türleri

En hassas ifade veri tipindeki tüm ifade değerlerinin toplamını döndürür.

İfade sonucu Dönüş türü
tinyint int
smallint int
int int
bigint bigint
ondalık kategori (p, s) ondalık (38, s)
para ve küçük para kategorileri para
Float ve gerçek kategori float

Açıklamalar

SUMve OVER yan tümceleri olmadan ORDER BY kullanıldığında belirleyici bir işlevdir. ve OVER yan tümceleriyle ORDER BY belirtildiğinde belirsiz değildir. Daha fazla bilgi için bkz. Deterministik ve deterministik olmayan fonksiyonlar.

Ayrıca, SUMfloat ve gerçek veri tipleriyle kullandığınızda belirsiz bir fonksiyon gibi davranıyor gibi görünebilir. Ancak temel sebep, bu veri türlerinin yaklaşık doğasıdır.

Örnekler

Bu makaledeki kod örnekleri, AdventureWorks2025 giriş sayfasından indirebileceğiniz AdventureWorksDW2025 veya örnek veritabanını kullanır.

A. Özet veriyi döndürmek için toplam kullanın

Aşağıdaki örnekler, AdventureWorks2025 veritabanında özet verilerin döndürülmesi için SUM fonksiyonunun kullanıldığını göstermektedir.

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

Sonuç kümesi aşağıdadır.

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

B. Over maddesini kullanın

Aşağıdaki örnekSUM, AdventureWorks2025 veritabanındaki tablodaki Sales.SalesPerson her bölge için yıllık satışların kümülatif toplamını sağlamak için madde OVER ile fonksiyonu kullanır. Veri ile TerritoryID bölünür ve mantıksal olarak sıralanır SalesYTD. Bu, SUM işlevinin satış yılına göre her bölge için hesaplandığını gösterir. 1 için TerritoryID , 2005 satış yılı için iki satır vardır ve bu satır o yıl satışa sahip iki satış kişisini temsil eder. Bu iki satırın toplam satış değeri hesaplanır ve ardından 2006 yılı satışlarını temsil eden üçüncü satır hesaplamaya dahil edilir.

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;

Sonuç kümesi aşağıdadır.

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

Bu örnekte, OVER yan tümcesi PARTITION BYiçermez. Bu, işlevin sorgu tarafından döndürülen tüm satırlara uygulandığı anlamına gelir. ORDER BY yan tümcesinde belirtilen OVER yan tümcesi, SUM işlevinin uygulandığı mantıksal sırayı belirler. Sorgu, maddede WHERE belirtilen tüm satış bölgeleri için yıl bazında toplam satış toplamını döndürür. ORDER BY deyiminde belirtilen SELECT yan tümcesi, sorgu satırlarının görüntülenme sırasını belirler.

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;

Sonuç kümesi aşağıdadır.

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

Örnekler: Azure Synapse Analytics ve Analytics Platform Sistemi (PDW)

C. Basit bir SUM örneği

Aşağıdaki örnek, 2003 yılında satılan her ürünün toplam sayısını geri getirmektedir.

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

Kısmi bir sonuç kümesi aşağıdadır.

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

D. Birden fazla sütunlu grup toplamlarını hesaplayın

Aşağıdaki örnek, tabloda ListPrice listelenen her renk için ve StandardCost toplamını hesaplarProduct.

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

Sonuç kümesinin ilk kısmı aşağıdaki sonuçlarda gösterilmiştir:

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