Grup By(Verilerin Gruplandırılması)

Grup fonksiyonları yukarıda da belirtiğim gibi gruplanmış veriler üzerinde işlem yapar.SQL cümlelerin de verilerin nasıl gruplanmasını istediğimizi GROUP BY ifadesi ile belirtiriz.

Yukarıda da anlatıgımız gibi grup fonksiyonları bir sütundaki verileri, bir işleme sokarak tek bir değer döndürür. Biz eğer tek değer döndürmesini istemiyorsanız, yani her grup için ayrı ayrı hesap yapmasını istiyorsak Group By  ‘ı kullanırız.

  • Aşagıda ki sorgu da employees tablosunda ki job_id sütununa göre gruplar ondan sonra da her grupdaki salary sütununda bulunan verilere göre ortalamayı verir.
Select job_id,AVG(salary) from employees GROUP BY job_id;
NOT : SQL cümlesinin SELECT kısmında kullanılan gruplama ifadeleri ve sabit değerler haricinde ki tüm sütunlar GROUP BY ifadesinde yer almalıdır.
Select job_id,manager_id,AVG(salary) from employees
GROUP BY job_id,manager_id;

NOT : Eger GROUP BY ifadesi kullanılmazsa SELECT kısmında sadece grup fonksiyonları ve sabit değerler kullanılabilir.Gruplama tüm kayıt üzerinde yapılır.

Select sysdate,manager_id,AVG(salary) from employees
GROUP BY job_id,manager_id;
  • GROUP BY ifadesi kullanıldığı zaman Oracle otomatik olarak kayıtları artan(ASC) şeklinde sıralar.
  • Sütun takma adları(alias) GROUP BY ifadesinde kullanılmaz.
  • GROUP BY ifadesinde  birden fazla sütun ya da ifade kullanılabilir.Bu durumda tüm kayıtlar veritabanından çekildikten sonra ilk önce GROUP BY ifadesnde yer alan ilk sütuna göre sıralama yapar.Daha sonra sırayla diğerlerine göre gruplama yapar.Sonuç olarak grup içinde grup olmuş olur.
Select sysdate,manager_id,AVG(salary) from employees where
salary > 5000 GROUP BY job_id,manager_id order by manager_id;
Select sysdate,COUNT(manager_id),AVG(salary) from employees
GROUP BY job_id;

HAVING

Grup fonksiyonları SQL cümlelerinin WHERE kısmında kullanılamaz.Bunun sebebi WHERE koşulu verilerin veritabanından çekilmesi sırasında uygulanır ama gruplama işlemi ise veriler çekildikten sonra yapılır.Bu nedenle grup fonksiyonlarını where kısmında kullanamayız.Grup fonksiyonlarını ise sınırlandırmak şart koymak istedigimiz de HAVING ifadesini kullanırız.Having deyimi SQL cümlelerinin en sonunda kullanılır.

  • Aşagıda ki sorguda employees tablosunda ki job_id sütununa göre gruplandırır ve bu gruplardan salary ortalaması 5000’den büyük olan grupların ortalamasını verir.
Select job_id,AVG(salary) from employees
GROUP BY job_id HAVING AVG(salary) > 5000;

CUBE ve ROLLUP

CUBE ve ROLLUP operatörleri SQL cümlelerinin GROUP BY kısmında kullanılırlar.

ROLLUP gruplaması yapıldıgı zaman sorgu sonucunda ki normal çıktı ile birlikte bu kayıtların gruplama ifadesine gore ilk grup yapılan sütunun ara toplamları da olur.ROLLUP fonksiyonunda kullanılan sütunların sırası önemlidir çünkü Oracle bu sıralamaya gore ara toplamların nerede verilecegini belirtir.

Select department_id,job_id,AVG(salary) from employees
GROUP BY ROLLUP(department_id,job_id);

CUBE gruplaması yapıldıgı zaman sorgu sonucunda ki normal çıktı ile birlikte  grup yapılan bütün sütunların ara toplamları olur.

Select department_id,job_id,AVG(salary) from employees
GROUP BY CUBE(department_id,job_id);

NOT  : Örneklerimde Oracleda ki DUAL table ’ ı ve HR user ’ ı kullanıyorum.
Yararlı olması Dilegiyle…
Yazar : Mustafa Bektaş Tepe
Java && Oracle

2,358 total views, 2 views today