VERİLERİ GRUPLAYARAK
ANALİZ
Dr. Hakan AYDIN
Bilgisayar Mühendisi
GRUP FONKSİYONLARİ
Tek satır fonksiyonları, tablonun bir satırına
uygulanabiliyordu. Bir grup satıra bir
fonksiyonun uygulanması söz konusu ise çoklu
satır fonksiyonları ya da diğer bir deyişle grup
fonksiyonlarından söz edilir.
Fonksiyonlar
Fonksiyonlar
Tek satır Çoklu satır
fonksiyonları fonksiyonları
AVG() VE SUM() FONKSİYONLARİ
AVG() fonksiyonu herhangi bir sütunun içerdiği sayısal değerlerin aritmetik
ortalamasını hesaplamak amacıyla kullanılır. Aşağıdaki sorgular ve tablo
değerleri buradan alınmıştır.
SELECT AVG(Price) FROM Products;
Sorgu sonucunda;
AVG() VE SUM() FONKSİYONLARİ
SUM() fonksiyonu sütunların içerdiği sayısal değerleri toplamak amacıyla
kullanılır. Aşağıdaki sorgular ve tablo değerleri buradan alınmıştır.
SELECT SUM(Price) FROM Products;
Sorgu sonucunda;
STDEV () VE VARP() FONKSİYONLARİ
STDEV () VE VARP() FONKSİYONLARİ
STDEV () VE VARP() FONKSİYONLARİ
ProductID ProductName Price
1 Product A 10.00
2 Product B 15.00
3 Product C 20.00
4 Product D 25.00
5 Product E 30.00
2. Adım: Her Bir Değerin Ortalamadan Farkını Bulma 3. Adım: Farkların Karesini
Alma
Her bir değerden ortalamayı çıkararak farkı buluyoruz.
Her bir farkın karesini alıyoruz
10−20=−10 (negatif değerlerin pozitifleşmesi
15−20=−5 için).
20−20=0 (−10) ^2=100
25−20=5 (−5) ^2=25
30−20=10 (0) ^2=0
(5) ^2=25
4. Adım: Karesi Alınan Farkların Toplamını Bulma (10) ^2=100
100+25+0+25+100= 250
MAX() VE MİN() FONKSİYONLARİ
Tablonun içerdiği değerlerin içerdiği en büyük ve en küçük olanlarını bulmak için MAX() ve
MIN() fonksiyonları kullanılır. Bu fonksiyonlar herhangi bir veri türüne uygulanabilir.
SELECT MIN(ÜCRET) AS “EN AZ”, MAX(ÜCRET) AS “EN FAZLA” FROM PERSONEL;
SELECT MAX(GİRİŞ_TAR) AS “EN SON” FROM PERSONEL;
SELECT MIN(ADI) AS “İLK İSİM” FROM PERSONEL;
Kullanılan yerler;
1. Maaş Analizi:
1. SELECT MIN(Salary) AS "Lowest Salary", MAX(Salary) AS "Highest Salary" FROM Employees;
2. Veritabanındaki En Güncel veya En Eski Tarihi Bulmak:
1. SELECT MAX(Join_Date) AS "Most Recent Join Date" FROM Employees;
3. Alfabetik Olarak İlk ve Son İsimleri Bulmak:
1. SELECT MIN(First_Name) AS "First Name Alphabetically" FROM Employees;
4. Satış ve Envanter Yönetimi:
1. SELECT MAX(price) AS "Most Expensive Product", MIN(price) AS "Cheapest Product" FROM Products;
5. En Yoğun Sunucu Yük Zamanlarını Bulmak:
1. SELECT MAX(cpu_load) AS "Peak CPU Load", MAX(memory_usage) AS "Peak Memory Usage", timestamp FROM
ServerLogs GROUP BY DATE(timestamp);
6. Gelişmiş Filtreleme ile Müşteri Aktivite Analizi:
1. SELECT CustomerID, MAX(Last_Login) AS "Most Recent Login", MIN(Registration_Date) AS "Earliest Registration",
COUNT(DISTINCT PurchaseID) AS "Total Purchases", AVG(Spend) AS "Average Spend"FROM CustomerActivity
WHERE Last_Login >= DATEADD(month, -6, GETDATE()) GROUP BY CustomerID HAVING COUNT(DISTINCT
PurchaseID) > 10;
COUNT() FONKSİYONU
Bir tablodaki kayıtların tutulması amacıyla kullanılır. İki farklı biçimde
kullanılabilir:
SELECT COUNT(*) AS "KAYIT SAYISI" FROM tblUrun WHERE listeFiyat >100;
COUNT(sütun) biçiminde kullanılırsa NULL değerler içermeyen tüm kayıtların
sayılmasına neden olur.
SELECT COUNT([Barkod]) AS "KAYIT SAYISI" FROM tblUrun WHERE
listeFiyat >100;
GRUPLAMA İŞLEMLERİ
Bir tablonun satırları gruplara ayrılarak, grup fonksiyonlarının bunlara
uygulanması sağlanabilir. GROUP BY sözcüğünden faydalanılır.
Örnek: markaKod alanına göre ürünlerin ortalama bayiFiyat ve toplam
stokDurum değerlerini gruplandırarak listeleyelim:
SELECT markaKod, AVG(bayiFiyat) AS OrtalamaBayiFiyat,
SUM(stokDurum) AS ToplamStokDurum FROM [dukkan].[dbo].[tblUrun]
GROUP BY markaKod ORDER BY markaKod;
GRUPLAMA İŞLEMLERİ
Örneğin, markaKod alanına göre ürünlerin bayiFiyat değerlerinin ortalamasını ve
stokDurum değerlerinin toplamını gruplandırarak listeleyelim. Sonuçları,
OrtalamaBayiFiyat sütununa göre sıralı şekilde elde edelim.
SELECT markaKod, AVG(bayiFiyat) AS OrtalamaBayiFiyat,
SUM(stokDurum) AS ToplamStokDurum FROM [dukkan].[dbo].[tblUrun]
GROUP BY markaKod ORDER BY OrtalamaBayiFiyat;
Bu sorgu her markaKod için:
bayiFiyat alanının ortalamasını (OrtalamaBayiFiyat olarak),
stokDurum alanının toplamını (ToplamStokDurum olarak) hesaplayacaktır.
Ve sonuçları OrtalamaBayiFiyat değerine göre küçükten büyüğe sıralayacaktır.
BİRDEN FAZLA SÜTUNA GÖRE GRUPLAMA
GROUP BY ile bir sütuna göre gruplama yapılabildiği gibi, birden fazla sütun için
de gruplama yapılabilir.
Örneğin, her markaKod ve bolgeKod bazında ürünleri gruplandırarak, bu
gruplardaki ürünlerin ortalama bayiFiyat ve toplam stokDurum değerlerini
hesaplayalım:
SELECT markaKod, bolgeKod, AVG(bayiFiyat) AS
OrtalamaBayiFiyat,SUM(stokDurum) AS ToplamStokDurum FROM [dukkan].
[dbo].[tblUrun] GROUP BY markaKod, bolgeKod ORDER BY markaKod,
bolgeKod;
Bu sorgu, tblUrun tablosundaki her markaKod ve bolgeKod kombinasyonu için:
bayiFiyat alanının ortalamasını (OrtalamaBayiFiyat olarak),
stokDurum alanının toplamını (ToplamStokDurum olarak) hesaplayacaktır.
Sonuçları, önce markaKod ve ardından bolgeKod sütununa göre sıralayacaktır.
Bu şekilde, her bir marka ve bölge kombinasyonuna göre ortalama bayi
fiyatını ve toplam stok durumunu görebilirsiniz.
BİRDEN FAZLA SÜTUNA GÖRE GRUPLAMA
Sonuçlar;
GRUP KOŞULLARİNİN KULLANİMİ
Grup işlemleri yerine getirilirken, grup bazında sınırlamalar söz
konusu olabilir. Örneğin, bölüm bazında bir işlemin, bölüm ücret
ortalamasının 2000’den büyük ise gerçekleşmesi istenebilir.
Hatalı
SELECT markaKod, AVG(bayiFiyat) AS OrtalamaBayiFiyat FROM
[dukkan].[dbo].[tblUrun] WHERE AVG(bayiFiyat) > 2000 GROUP BY
markaKod;
Msg 147, Level 15, State 1, Line 17
An aggregate may not appear in the WHERE clause unless it is in a
subquery contained in a HAVING clause or a select list, and the column
being aggregated is an outer reference.
Doğru
SELECT markaKod, AVG(bayiFiyat) AS OrtalamaBayiFiyat FROM [dukkan].
[dbo].[tblUrun] GROUP BY markaKod HAVING AVG(bayiFiyat) > 2000;
Bu sorgu, markaKod alanına göre gruplama yaparak her markanın
bayiFiyat ortalamasını (OrtalamaBayiFiyat olarak) hesaplar.
Ancak, yalnızca OrtalamaBayiFiyat değeri 2000'den büyük olan
markaKod gruplarını sonuç olarak döndürür.
Not: WHERE ifadesi gruplama işleminden önce filtreleme
yaparken, HAVING ifadesi gruplama işleminden sonra koşula göre
filtreleme yapar. Bu yüzden burada HAVING kullanmamız gerekir.
GRUP KOŞULLARİNİN KULLANİMİ
Örnek: her bolgeKod bazında ürünleri gruplandırarak
ortalama bayiFiyat değerlerini hesaplayalım. Ancak
yalnızca ortalama bayiFiyat değeri 2'den büyük olan
bölgeleri listelemek istiyoruz:
SELECT bolgeKod, AVG(bayiFiyat) AS OrtalamaBayiFiyat FROM
[dukkan].[dbo].[tblUrun] GROUP BY bolgeKod HAVING
AVG(bayiFiyat) > 2;
GRUP KOŞULLARİNİN KULLANİMİ
Örnek: Pazarlama bölümü dışında çalışan personeli görevlerine göre gruplandırıp
ücretleri toplayan; bölümün toplam ücretini 5000’den fazla olanlar seçen ve
sonuçları en düşük ücret toplamından büyüğe doğru sıralamak için:
SELECT GÖREVİ, SUM(ÜCRET) AS TOPLAM FROM PERSONEL WHERE GÖREVİ <>
'PAZARLAMACI' GROUP BY GÖREVİ HAVING SUM(ÜCRET) > 5000 ORDER BY
SUM(ÜCRET);
WHERE GÖREVİ <> 'PAZARLAMACI‘
WHERE ifadesi, yalnızca 'PAZARLAMACI' olmayan görevdeki personeli seçmek için kullanılır.
Bu adımda, pazarlama bölümünde çalışanlar hariç tüm personel listelenir.
GROUP BY GÖREVİ
GROUP BY ifadesi, GÖREVİ alanına göre gruplandırma yapar. Bu sayede aynı görevde
çalışan personeller bir araya getirilir ve gruplandırılır.
SUM(ÜCRET) AS TOPLAM
SUM(ÜCRET) ifadesi, her görev için toplam ücret değerini hesaplar. AS TOPLAM ile bu
hesaplanan değere TOPLAM adı verilir. Böylece her görevin toplam ücreti bir sütun olarak
döner.
HAVING SUM(ÜCRET) > 5000
HAVING ifadesi, grup bazında koşul belirlemek için kullanılır. Bu adımda yalnızca toplam
ücreti 5000'den fazla olan görev grupları filtrelenir. Yani, her görev için toplam ücretin 5000'i
geçip geçmediğine bakılır.
ORDER BY SUM(ÜCRET)
ORDER BY ifadesi, SUM(ÜCRET) yani TOPLAM sütununa göre sonuçları sıralar. Bu durumda en
düşük ücret toplamından başlayarak büyükten küçüğe doğru bir sıralama yapılır.