Toplama işlevlerini kullanma

Tamamlandı

T-SQL, birden çok değer alan ve tek bir sonuç döndüren hesaplamalar yapmak için TOPLA, MAX ve AVG gibi toplama işlevleri sağlar.

Toplama işlevleriyle çalışma

Baktığımız sorguların çoğu, satırları filtrelemek için WHERE yan tümcesi kullanarak bir satır üzerinde çalışır. Döndürülen her satır, özgün veri kümesindeki bir satıra karşılık gelir.

SQL Server'da birçok toplama işlevi sağlanır. Bu bölümde SUM, MIN, MAX, AVG ve COUNT gibi en yaygın işlevleri inceleyeceğiz.

Toplama işlevleriyle çalışırken aşağıdaki noktaları göz önünde bulundurmanız gerekir:

  • Toplama işlevleri tek bir (skaler) değer döndürür ve SELECT deyimlerinde neredeyse tek bir değerin kullanılabileceği her yerde kullanılabilir. Örneğin, bu işlevler SELECT, HAVING ve ORDER BY yan tümcelerinde kullanılabilir. Ancak, WHERE yan tümcesinde kullanılamazlar.
  • TOPLAMA işlevleri, SAY(*) kullanımı dışında, DLL'leri yoksayar.
  • AS kullanarak bir diğer ad sağlamadığınız sürece SELECT listesindeki toplama işlevlerinin sütun üst bilgisi yoktur.
  • SELECT listesindeki toplama işlevleri, SELECT işlemine geçirilen tüm satırlarda çalışır. GROUP BY yan tümcesi yoksa WHERE yan tümcesindeki herhangi bir filtreyi karşılayan tüm satırlar özetlenir. Bir sonraki konu başlığında GROUP BY hakkında daha fazla bilgi edinacaksınız.
  • GROUP BY kullanmıyorsanız, toplama işlevlerini aynı SELECT listesindeki işlevlere dahil olmayan sütunlarla birleştirmemelisiniz.

SQL Server, yerleşik işlevlerin ötesine geçmek için .NET Ortak Dil Çalışma Zamanı (CLR) aracılığıyla kullanıcı tanımlı toplama işlevlerine yönelik bir mekanizma sağlar. Bu konu bu modülün kapsamı dışındadır.

Yerleşik toplama işlevleri

Belirtildiği gibi Transact-SQL birçok yerleşik toplama işlevi sağlar. Yaygın olarak kullanılan işlevler şunlardır:

İşlev Adı

Söz dizimi

Açıklama

SUM

TOPLA(ifade)

Bir sütundaki NULL olmayan tüm sayısal değerleri toplar.

AVG

AVG(ifade)

Bir sütundaki (toplam/sayı) NULL olmayan tüm sayısal değerlerin ortalamasını verir.

MIN

MIN(ifade)

En küçük sayıyı, en erken tarih/saati veya ilk oluşan dizeyi döndürür (harmanlama sıralama kurallarına göre).

MAX

MAX(ifade)

En büyük sayıyı, en son tarih/saati veya son oluşan dizeyi döndürür (harmanlama sıralama kurallarına göre).

COUNT veya COUNT_BIG

COUNT(*) veya COUNT(ifade)

(*) ile, NULL değerlerine sahip satırlar da dahil olmak üzere tüm satırları sayar. Bir sütun ifade olarak belirtildiğinde, bu sütun için NULL olmayan satırların sayısını döndürür. BAĞ_DEĞ_SAY işlevi bir int döndürür; COUNT_BIG bir big_int döndürür.

SELECT yan tümcesinde yerleşik bir toplama kullanmak için MyStore örnek veritabanında aşağıdaki örneği göz önünde bulundurun:

SELECT AVG(ListPrice) AS AveragePrice,
       MIN(ListPrice) AS MinimumPrice,
       MAX(ListPrice) AS MaximumPrice
FROM Production.Product;

Bu sorgunun sonuçları şuna benzer:

AveragePrice

MinimumFiyat

MaximumPrice

744.5952

2.2900

3578.2700

Yukarıdaki örnekte Production.Product tablosundaki tüm satırların özetlendiğini unutmayın. Sorguyu, where yan tümcesi ekleyerek belirli bir kategorideki ürünlerin ortalama, en düşük ve en yüksek fiyatlarını döndürecek şekilde kolayca değiştirebiliriz:

SELECT AVG(ListPrice) AS AveragePrice,
       MIN(ListPrice) AS MinimumPrice,
       MAX(ListPrice) AS MaximumPrice
FROM Production.Product
WHERE ProductCategoryID = 15;

SELECT yan tümcesinde toplamalar kullanılırken, SELECT listesinde başvuruda bulunılan tüm sütunlar bir toplama işlevi için giriş olarak kullanılmalıdır veya GROUP BY yan tümcesinde başvurulmalıdır.

Toplanan sonuçlara ProductCategoryID alanını eklemeye çalışan aşağıdaki sorguyu göz önünde bulundurun:

SELECT ProductCategoryID, AVG(ListPrice) AS AveragePrice,
MIN(ListPrice) AS MinimumPrice,
MAX(ListPrice) AS MaximumPrice
FROM Production.Product;

Bu sorgunun çalıştırılması aşağıdaki hatayla sonuçlanır

Msg 8120, Düzey 16, Durum 1, Satır 1

Toplama işlevinde veya GROUP BY yan tümcesinde yer almadığından seçme listesinde 'Production.ProductCategoryID' sütunu geçersiz.

Sorgu tüm satırları tek bir toplanmış grup olarak ele alır. Bu nedenle, tüm sütunlar işlevleri toplamak için giriş olarak kullanılmalıdır.

Önceki örneklerde, önceki örnekteki fiyat ve miktarlar gibi sayısal verileri bir araya topladık. Toplama işlevlerinden bazıları tarih, saat ve karakter verilerini özetlemek için de kullanılabilir. Aşağıdaki örneklerde, toplamaların tarihler ve karakterlerle kullanımı gösterilmektedir:

Bu sorgu, MIN ve MAX kullanarak ada göre ilk ve son şirketi döndürür:

SELECT MIN(CompanyName) AS MinCustomer, 
       MAX(CompanyName) AS MaxCustomer
FROM SalesLT.Customer;

Bu sorgu, veritabanının harmanlama dizisinde CompanyName için ilk ve son değerleri döndürür ve bu durumda alfabetik sıradadır:

MinCustomer

MaxCustomer

Bisiklet Mağazası

Sarı Bisiklet Şirketi

Diğer işlevler toplama işlevleriyle iç içe yerleştirilmiş olabilir.

Örneğin, Mİn ve MAX değerlendirilmeden önce sipariş tarihinin yalnızca yıl bölümünü döndürmek için year skaler işlevi aşağıdaki örnekte kullanılır:

SELECT MIN(YEAR(OrderDate)) AS Earliest,
       MAX(YEAR(OrderDate)) AS Latest
FROM Sales.SalesOrderHeader;

En erken

En geç

2008

2021

MIN ve MAX işlevleri, en erken ve en son kronolojik değerleri döndürmek için tarih verileriyle de kullanılabilir. Ancak ORT ve TOPLA yalnızca tamsayılar, para, float ve ondalık veri türlerini içeren sayısal veriler için kullanılabilir.

Toplama işlevleriyle DISTINCT kullanma

Yinelenen satırları kaldırmak için BIR SELECT yan tümcesinde DISTINCT kullanımına dikkat etmeniz gerekir. Toplama işleviyle kullanıldığında DISTINCT, özet değeri hesaplamadan önce giriş sütunundan yinelenen değerleri kaldırır. DISTINCT, siparişler tablosundaki müşteriler gibi değerlerin benzersiz oluşumlarını özetlerken kullanışlıdır.

Aşağıdaki örnek, kaç sipariş vermiş olursa olsun, sipariş veren müşterilerin sayısını döndürür:

SELECT COUNT(DISTINCT CustomerID) AS UniqueCustomers
FROM Sales.SalesOrderHeader;

BAĞ_DEĞ_SAY(<some_column>) yalnızca sütunda değeri olan satırları sayar. NULL değer yoksa, BAĞ_DEĞ_SAY(<some_column>) COUNT(*) ile aynı olur. COUNT (DISTINCT <some_column>), sütunda kaç farklı değer olduğunu sayar.

NULL ile toplama işlevlerini kullanma

Verilerinizde OLASı NUL'lerin varlığını ve NULL'nin toplama işlevi de dahil olmak üzere T-SQL sorgu bileşenleriyle nasıl etkileşime geçtiğini bilmeniz önemlidir. Dikkat edilmesi gereken birkaç nokta vardır:

  • (*) seçeneğiyle kullanılan BAĞ_DEĞ_SAY dışında, T-SQL toplama işlevleri DLL'leri yoksayar. Örneğin TOPLA işlevi yalnızca NULL olmayan değerler ekler. DLL'ler sıfır olarak değerlendirilmez. BAĞ_DEĞ_SAY(*), herhangi bir sütundaki değerden veya değer olmayandan bağımsız olarak tüm satırları sayar.
  • Bir sütundaki NUL'lerin varlığı AVG için yanlış hesaplamalara yol açabilir. Bu işlem yalnızca doldurulan satırları toplar ve toplamı NULL olmayan satır sayısına böler. AVG(sütun) ile (TOPLA<>(<sütun>)/BAĞ_DEĞ_SAY(*)) arasındaki sonuçlarda bir fark olabilir.

Örneğin, t1 adlı aşağıdaki tabloyu göz önünde bulundurun:

C1

C2

1

NULL

2

10

3

20

4

30

5

40

6

50

Bu sorgu, AVG'nin NULL işleme şekliyle SUM/COUNT(*) hesaplanan sütunuyla ortalama hesaplama yöntemi arasındaki farkı gösterir:

SELECT SUM(c2) AS sum_nonnulls, 
    COUNT(*) AS count_all_rows, 
    COUNT(c2) AS count_nonnulls, 
    AVG(c2) AS average, 
    (SUM(c2)/COUNT(*)) AS arith_average
FROM t1;

Sonuç şöyle olacaktır:

sum_nonnulls

count_all_rows

count_nonnulls

ortalama

arith_average

150

6

5

30

25

Bu sonuç kümesinde ortalama adlı sütun, dahili olarak 150'nin toplamını alan ve c2 sütunundaki null olmayan değerlerin sayısına bölünen toplamdır. Hesaplama 150/5 veya 30 olabilir. arith_average adlı sütun, toplamı açıkça tüm satırların sayısına böldüğünden hesaplama 150/6 veya 25 olur.

NULL olsun veya olmasın tüm satırları özetlemeniz gerekiyorsa, DLL'leri toplama işleviniz tarafından yoksayılmayacak başka bir değerle değiştirmeyi göz önünde bulundurun. Bu amaçla COALESCE işlevini kullanabilirsiniz.