Oracle Ders 27 – Group Functions – 02

Merhaba Arkadaslar,
Bir onceki yazimda Aggregate Function olarak isimlendirilen , SUM, AVG , COUNT, MAX , MIN fonksiyonlarindan bahsetmistim.Bu yazimda Grouping data (Veri Gruplama) , Group by ve having konusundan bahsedecegim.

Not: Tablolari daha onceki derslerde olusturmustuk. Ayni tablolar uzerinde devam ediyorum.

Group By
Oncelikle su sorguyu calistiralim ve neden Group By a ihtiyacimiz oldugunu anlamaya calisalim.

select category, TO_CHAR(AVG(retail-cost), '999.99') "Profit" from books;

ORA-00937: not a single-group group function
00937. 00000 – “not a single-group group function”

Bu sorgu yukarida belirtigim hatayi dondurecektir. Peki neden ?

  • Bir Select sorgusunda ,group function kullanildiginda (burada AVG kullandik) , nonaggregate yani tekil, birlesmemis her sutun ( burada category) mutlaka Group By ile kullanilmalidir.
  • Group by ile kullanilan bir sutun , select ifadesi icersinde yer almak zorunda degildir.
  • Column Alias ( kolon takma isimleri) Group By ifadesinde kullanilamazlar.
select category, TO_CHAR(AVG(retail-cost), '999.99') "Profit" from books
Group By category;

oracle der 27 group by 1. jpg

Gordugunuz gibi bu sefer Select sorgusu Group Function ile sorunsuz calisti ve Category ye gore gruplama islemi yapti , sonucu dondurdu.

Bir baska ornek olarak ;

select title , MAX(retail-cost) "Highest Profit" from books
group by title;

Burada da title kolonuna gore gruplama yapiyoruz ve group function ( MAX ) ile sorunsuz kullaniyoruz.

Group By i join islemleri ile de kullanabiliriz.

select customer#, order# , sum(quantity*paideach) "Order Total"
from orders join orderitems using (order#)
group by customer# , order#;

Burada her customer# ve order# icin gruplama islemi yapiyoruz.

Having
Having , group by ile gruplanan veri uzerinde bir kisitlama islemi yapmaya yarar.

select category, TO_CHAR(AVG(retail-cost), '999.99') "Profit" from books
Group By category
Having AVG(retail-cost) >20;

Biraz once kullandigimiz sorgumuza Having yapisini ekledik. Burada gruplanarak donen verinin icerisinde 20 den buyuk olma sartini aradik. Tek bir sonuc donecektir.

Unutmayalim , Where islemi Group By ve Having yapisi icerisinde yine kullanilabilir.

Select category, TO_CHAR(AVG(retail-cost), '999.99') "Profit"
from books
where pubdate >'01-Jan-05'
group by category
having AVG(retail-cost) >10;

Bu sorguda category alanina gore gruplama yapiyoruz , fakat gruplama islemi yapmadan once pubdate alaninin 01 January 2005 tarihinden buyuk olmasini istiyoruz. Sonrasinda Having islemi ile donen gruplanmis veri icin istenen sartin saglanmasini istiyoruz.

oracle der 27 group by having 2. jpg

Bu siralama yapisi onemlidir , yani once where , sonra group by sonra da having yazilmalidir.
Where islemi veriyi gruplamadan once filtrelemek icin kullanilir , having islemi ise veriyi grupladiktan sonra filtrelemek icin kullanilir.

Group by ile kullandigimiz alani where isleminde de kullanabiliriz. Ornegin ;

Select category, TO_CHAR(AVG(retail-cost), '999.99') "Profit"
from books
where category in ('COMPUTER','CHILDREN','BUSINESS')
group by category 
having AVG(retail-cost) >15;

Burada yine category alanina gore gruplama yapiyoruz ama oncesinde where ile category alanini filtreliyoruz. Sadece COMPUTER CHILDREN BUSINESS category lerini hesaba katmasini istiyoruz. Sonrasinda having ile gruplanan veriyi filtreliyoruz.

oracle der 27 group by having 3. jpg

Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
injavawetrust

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *