Group By ALL Kullanimi

T-SQL de GROUP BY ALL Kullanimi:

Verileri grouplarken Where cümlesi içinde bir filtre uygular isek, bu filtreye uymayan kayitlara ait grouplama alanlari sorgu sonucunda yer almazlar. Örnegin Fiyati 100 Tl altinda olan ürünleri, Ürün kategorisine göre gruplayip, ürün sayisini görmek istersek, 100 tl altinda hiç bir ürün bulundurmayan bir kategori sonuçta yer almayacaktir. Eger biz 100 tl den daha ucuz ürün barindirmayan kategorileri, ürün sayisi 0 olacak sekilde sorgu sonucundaki listelemek istiyorsak GROUP BY yerine GROUP BY ALL kullanabiliriz. ALL anahtar kelimesini kullanarak ve kullanmayarak bu islemi yerine getirebiliriz, Asagidaki iki yöntem içinde örneklerle konuyu açiklamaya çalistim.

Ilk olarak ürün bilgilerini tutacagimiz tablomuzu olusturup içine örnek kayitlari asagidaki sorgu ile atalim.

.

create table Urun 
(
    UrunID int identity(1,1),	
    KategoriAdi varchar(20),
    UrunAdi varchar(100),
    Ucret int	
)
insert into Urun values 
	('Cep Telefonu','nokia 808 PureView',300)
	,('Cep Telefonu','Samsung Galaxy S2',550)
	,('Notebook','HP EliteBook 8460p',1500)
	,('PC','Dell',900),('PC','Acer',1000)
	,('Mouse','A4 Tech',10)

Ürün tablomuzda fiyati 1000 TL ve daha az olan ürünleri kategori adina göre gruplayip, her kategiride bu tanimlamaya uyan kaç ürün varmis bakmak istersek asagidaki sorguyu kullanmamiz gerekir.

select KategoriAdi,count(*) as UrunSayisi
FROM Urun 
WHERE Ucret <= 1000
Group by KategoriAdi
order by 1

Sorgu Sonucu:

KategoriAdi          UrunSayisi
-------------------- -----------
Cep Telefonu         2
Mouse                1
PC                   2

(3 row(s) affected)

Yukaridaki sorgu sonucunu inceledigimiz zaman notebook kategorisinde 1000 tl ve asagisi fiyatta ürün olmadigi için herhangi bir kayit gelmedi. Peki biz koydugumuz fiyat kriterine uymasa bile bu kategorininde ürün sayisi 0 olacak sekilde gelmesini istersen ne yapmamiz gerekir.

GROUP BY ALL kullanmadan yukaridaki sorunun cevabini bulalim ilk olarak. Bu durumda sorguda where kismini kaldirip case ile ücret bilgisini kontrol etmemiz gerekiyor. Istedigimiz ücret bilgisine sahip olanlar için 1 olmayanlar için 0 degeri vererek toplama islemi yaparsak sorgu ve sonuç asagidaki gibi olur.

.

select KategoriAdi
	,sum(case when  Ucret <= 1000 then 1 else 0 end) 
    	as UrunSayisi
FROM Urun 
Group by KategoriAdi
order by 1

Sorgu Sonucu:

KategoriAdi          UrunSayisi
-------------------- -----------
Cep Telefonu         2
Mouse                1
Notebook             0
PC                   2

(4 row(s) affected)

Yuakridaki Sorgu sonucunu incelerseniz notebook kategorisinde 1000 tl ve altinda fiyata sahip ürün olmamasina ragmen sorgu sonucunda bu kategoride listelendi fakat ürün sayisi 0 olarak geldi.

Simdi ise yukaridaki sonuca GROUP BY ALL kullanarak ulasalim.

select KategoriAdi,count(*) as UrunSayisi
FROM Urun 
WHERE Ucret <= 1000
Group by ALL KategoriAdi
order by 1

Sorgu Sonucu:

KategoriAdi          UrunSayisi
-------------------- -----------
Cep Telefonu         2
Mouse                1
Notebook             0
PC                   2
Warning: Null value is eliminated by an aggregate or other SET operation.

(4 row(s) affected)

Group by all kullanirken where filtresinde Ucret <=1000 yazmamiza ragmen notebook kategoriside sonuçda yer aliyor. Group by all kullaniminda; SQL Engine group elemanlarini bulurken where cümlesini göz ardi eder fakat aggregation islemlerinde hesaplama yaparken where cümlecigini hesaba katar.

Group by All ve Case Kullanimi arasindaki fark

Yukarida iki farkli sorgu ile ayni sonuca ulastik. Peki hangi sorgu daha efektif çalismakta ? Bunu sorgularimizi hemen basina SET STATISTICS IO ON yazarak ayri ayri çalistirip görebiliriz. Sonu olarak asagidaki gibi case ile olusturdugumuz sorgu tabloyu 1 kez scan ederken, group by all 2 kez scan etti.

Group By All Kullanildiginda :
Table 'Urun'. Scan count 2, logical reads 2, physical reads 0,
 read-ahead reads 0, lob logical reads 0, lob physical reads 0, 
 lob read-ahead reads 0.

Case Kullanildiginda : 
Table 'Urun'. Scan count 1, logical reads 1, physical reads 0,
 read-ahead reads 0, lob logical reads 0, lob physical reads 0,
  lob read-ahead reads 0.

Yukarida ki istatistik sonuçlarina göre group by all yerine case kullanmak çok daha hizli sonuç verecektir. Milyarlarca kayit olan bir tabloda 2.kez bir scan isleminin maliyeti büyük olacaktir.

.

Tags:

3 thoughts on “Group By ALL Kullanimi

  • tam olarak iste?ini do?rumu anladym bilmiyorum ama amacyn en cok gyrys yapylan gunu ve o gun ku gyrys sayysyny bulmak yse asagydaky gyby yapabylyrsyn.

    ben senyn tablona benzer byr temp tablo yaptym, ornek kayyt gyrdym, sen kendy tablona cevyryrsyn

    drop table #Sayac
    create table #Sayac
    (
    Tarih datetime,
    IPNO varchar(100),
    Toplam int
    )
    INSERT INTO #Sayac VALUES(getdate(),’1′,100)
    INSERT INTO #Sayac VALUES(getdate(),’2′,50)
    INSERT INTO #Sayac VALUES(getdate(),’3′,5)
    INSERT INTO #Sayac VALUES(getdate()-1,’65’,25)
    INSERT INTO #Sayac VALUES(getdate()-1,’85’,10)
    INSERT INTO #Sayac VALUES(getdate()-2,’22’,10)
    INSERT INTO #Sayac VALUES(getdate()-3,’22’,11)
    select top 1 * from 
    (
    select convert(varchar,Tarih,106) as Gun,sum(Toplam) as ToplamGiris from #Sayac group by convert(varchar,Tarih,106)
    )t order by ToplamGiris desc
  • Hocam sayac tablomda 3 adet sütun var.
    Tarih(datetime), IPno(nvarchar(50), Toplam(int) ?eklinde. Sayac ?u ?ekilde çaly?yyor. Gelen IpNo yoksa yeni satyr ekliyor varsa Ilgili Ip adresinin kar?ysynda Toplam sütununa +1 ekliyorum.
    Kayytlary listelerken günlük tekil, günlük ço?ul, dün tekil, dün ço?ul ?eklinde sqlden veriyi çekip labellere aktarabiliyorum. Ancak tarihleri süzüp en çok tekil giri? yapylan tarihte count sayysyny alamyyorum. Yardymcy olabilir misiniz?
    Not: Tabloyu ilk olu?turdu?umda tarih (date) idi. Ylk kayytlar ör: 2016/08/15 00:00:00 ?eklinde geliyordu. Bu kayytlarda

    — select top 1 tarih = convert(varchar(20),Tarih,106) , count(Toplam) grupla
    –from Sayac
    –group by tarih
    –order by grupla desc

    Stored Procedures ile kaydy çekebiliyorum. Ancak datetime ile kayyt satyr toplamyny alamyyorum.

  • Bir kaç gündür bir sorguda takiliyordm hatamin kaynagini buldum. Gerçekten çok faydali oldu. tesekkürler.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.