5. Reporting Aggregated Data Using the Group Functions
GRUP FONKSİYONLARI KULLANMA
Grup fonksiyonları ile bir tablodan özet bir bilgi buluruz. Örneğin maaşlar kolonundan toplam maaşı, ortalama maaşı grup fonksiyonları yardımıyla buluruz.
Grup Fonksiyonlar Türleri
- AVG — ORTALAMA
- COUNT — DEĞER(SAYI)
- MAX
- MİN
- STDDEV — STANDART HATA
- SUM — TOPLAM
- VARIANCE — VARYANS
GRUP FONKSİYONLARI SYNTAX
SELECT group_function(column), ... FROM table [WHERE condition] [ORDER BY column];
SELECT AVG(salary), MAX(salary), MIN(salary), SUM(salary) FROM employees WHERE job_id LIKE '%PROG%'; -- job_id içerisinde 'PROG' ifadesi geçenler için istenilen -- grup fonksiyonlarını hesapladık. -- tarih,karakter ifadeleri için de kullanabiliriz.
SELECT COUNT(*) FROM employees WHERE department_id = 50; -- count (*) o tablodaki tüm satırların sayısını verir. --COUNT(commission_pct) için satır adedini verir.
SELECT COUNT(DISTINCT department_id) FROM employees; -- Tekrar etmeyen department_id sayısı
Group Functions and Null Values ( Grup Fonksiyonları ve Boş Değerler)
SELECT AVG(commission_pct) FROM employees; -- comm oranlarının ortalaması -- null değerleri barındırdığı için hatalıdır
SELECT AVG(NVL(commission_pct, 0)) FROM employees; --comm değeri null olmayanların ortalaması -- doğru sonucu verir.
Grouping rows ( Satırları Gruplanması)
GROUP BY Clause
SELECT department_id, AVG(salary) FROM employees GROUP BY department_id ; -- department_id ile salary ortalamasını gruplandırdık
Çoklu Sütunlar için Gruplandırma:
SELECT department_id dept_id, job_id, SUM(salary) FROM employees GROUP BY department_id, job_id ORDER BY SUM(salary) -- iki kolona göre gruplandırıp sum(salary)'ye göre sıralıyoruz
İzin Verilmeyen Grup Sorguları:
SELECT department_id, job_id, COUNT(last_name) FROM employees GROUP BY department_id; -- Grup sayıları farklı olacağı için hata verecektir. -- Bunu engellemek için COUNT(JOB_ID) eklenmelidir.
SELECT department_id, AVG(salary) FROM employees WHERE AVG(salary) > 8000 GROUP BY department_id;
Bu sorunları HAVING Clause ile çözüme kavuşturacağız.
HAVING Clause ile Grup Sonuçlarını Koşullara göre Kısıtlama
SELECT department_id, MAX(salary) FROM employees GROUP BY department_id HAVING MAX(salary)>10000 ; -- where clause gibi çalışır şarta göre gruplandırma yapar.
SELECT job_id, SUM(salary) Toplam Maaş FROM employees WHERE job_id NOT LIKE '%REP%' GROUP BY job_id HAVING SUM(salary) > 13000 ORDER BY SUM(salary); -- job_id içinde 'rep' olmayan -- sum salary 13000'den büyük olan -- job_id ile salary kolonlarını gruplandır. -- salary göre sırala.
Grup Fonksiyonlarını İç İçe Kullanma
SELECT MAX(AVG(salary)) FROM employees GROUP BY department_id; -- fonksiyonların yeri önem taşımaktadır. -- içte yer alan önce hesaplanır. daha sonra dışa doğru gidilir -- önce ortalama maaşları bulduk. daha sonra max olanı yazdık.
SELECT AVG(MAX(salary)) FROM employees GROUP BY department_id; -- önce max'ları bulup daha sonra ortalama hesaplamıştır
Derslerin devamı gelecektir. Eksik ve yanlış bulduğunuz noktalarda geri dönüş yaparsanız çok memnun kalırım. Daha sonraki derste JOIN kullanımından bahsedilecektir.