Giris
SQL Serverda case fonksiyonu sorgu sonucu dönen bir kolonun degerine göre farkli islemler yapabilmemize olanak saglar. Istedigimiz bir kolonun degerini belirli sartlari kontrol ederek yeni bir degerle degistirmek için kullanabiliriz. Örnegin tablomuzdaki cinsiyet kolonundan ‘E’ geldiginde sorgu sonucunda Erkek ‘B’ geldiginde ise Bayan yazmasini istiyorsak case fonksiyonunu kullanmak en mantikli ve en kolay yoldur. Basit bir örnekle baslayacak olursak;
.
Kisi diye bir tablomuz olsun bu tablodan select Ad,Soyad,Cinsiyet from Kisi sorgusu ile kayit çektigimizde asagidaki liste dönmekte.
Ad | Soyad | Cinsiyet |
---|---|---|
Ali | Demir | E |
Hasan | Ertekin | E |
Ilhan | Yücel | E |
Leyla | Ece | B |
Metin | Tosun | E |
Dikkat edilirse Cinsiyet için tek karakterlik bir sonuç dönmekte, eger biz sorgu sonucunda cinsiyeti ‘E’ olan kayitlari Erkek, ‘B’ olan kayitlari da Bayan diye göstermek istersek asagidaki sorguyu yazmamiz gerekir.
SELECT Ad,Soyad, case Cinsiyet when 'E' then 'Erkek' when 'B' then 'Bayan' end as Cinsiyet FROM Kisi
Yukaridaki sorgu sonucu asagidaki liste döner. Listede de görüldügü gibi Cinsiyet kolonunu istedigimiz yapida degistirerek listeye ekledik.
Ad | Soyad | Cinsiyet |
---|---|---|
Ali | Demir | Erkek |
Hasan | Ertekin | Erkek |
Ilhan | Yücel | Erkek |
Leyla | Ece | Bayan |
Metin | Tosun | Erkek |
Case fonksiyonu bir çok farkli durum için kullanilabilir. Örnegin Musteri ve KonusmaKaydi diye iki tablomuz var. Her musterinin konumsa kayitlari konumsa kaydi tablosunda konusma yönüne göre tutuluyor. Her konumsa için konusma kaydi tablosuna yeni bir kayit giriliyor. Konusma yönü sehir içi, sehirlerarasi, GSM gibi degisiklik göstermekte. Biz müsterinin konusma kayitlarini bulmak için bu iki tabloyu birbirine baglayarak istegimiz kayitlari alabiliriz. Tablo yapilarimiz asagidaki gibi olsun ve bu tablolardan Join islemi ile kayit çekelim;
SELECT m.Ad, m.Soyad, k.Yon, k.Saniye FROM Musteri AS m LEFT OUTER JOIN KonusmaKaydi AS k ON k.MusteriKey = m.MusteriKey
Yukaridaki sorguyu çalistirdigimizda asagidaki sonuç döner.
Ad | Soyad | Yon | Saniye |
---|---|---|---|
Seher | KUNT | 1 | 200 |
Seher | KUNT | 1 | 80 |
Seher | KUNT | 3 | 85 |
Mehmet Sabri | KUNT | 1 | 120 |
Mehmet Sabri | KUNT | 1 | 35 |
Mehmet Sabri | KUNT | 2 | 65 |
Mehmet Sabri | KUNT | 3 | 90 |
Mehmet Sabri | KUNT | 2 | 65 |
Metin | TOSUN | 1 | 34 |
Metin | TOSUN | 1 | 90 |
Metin | TOSUN | 2 | 900 |
Yukaridaki listeye bakacak olursak müsterilerin yapmis oldugu her konusma bilgisi yeni bir satirda gösterilir. Bu listedeki Yon kolonundaki 1 degeri sehir içi 2 degeri sehirler arasi ve 3 degeri GSM olsun. Biz her müsteri için konusma detaylarini tek bir satirda müsteri adi sehir içi toplam sehirlerarasi toplam ve GSM toplam seklinde göstermek istersek ne yapmamiz gerekir. Iste bu durumda case fonksiyonu devreye giriyor. Simdi sorgumuzu case fonksiyonunu kullanarak asagidaki hale getirelim.
SELECT m.Ad,m.Soyad, SUM(case when k.Yon = 1 then k.Saniye else 0 end) as SehirIçi, SUM(case when k.Yon =2 then k.Saniye else 0 end) as SehirlerArasi, SUM(case when k.Yon =3 then k.Saniye else 0 end) as GSM FROM Musteri AS m LEFT OUTER JOIN KonusmaKaydi AS k ON k.MusteriKey = m.MusteriKey group by m.Ad,m.Soyad
Yukaridaki sorguda dikkat ederseniz Yon bilgisine göre 3 farkli kolon olusturduk. Sum içine yazdigimiz case cümlecigi Yon kolonunun tipine göre kolon degerini veya 0 degerini getirerek müsteriye ait konusma sürelerini toplayarak yeni bir kolon olarak gösterir. Sorgunun çiktisi asagidaki gibidir.
Ad | Soyad | SehirIçi | SehirlerArasi | GSM |
---|---|---|---|---|
Mehmet Sabri | KUNT | 155 | 130 | 90 |
Seher | KUNT | 280 | 0 | 85 |
Metin | TOSUN | 124 | 900 | 0 |
Case fonksiyonu için bir birinden farkli birçok örnek verilebilir. Umarim verdigim örnekler faydali olmustur. Sorulariniz ve yorumlariniz için sayfadaki yorum ekle kismini kullanabilirsiniz.
Merhabalar;
Bilgiler çok güzel ve anlasilir.
En son olusan SQL sorgusu için birsey sormak istiyorum.
Sorgu sonucunu bozmadan AD sütununa göre siralamak için ne yapabiliriz.
Birde hiç konusma yapmayan birisi (SehirIci=0, SehirlerArasi=0, GSM=0) bu sorguda sonuç listesinde SIFIR olarak görünüyor mu? Görünmüyorsa buna da bir çare var mi?
Tesekkürler
ad stununa gore sıralama yapmak ıcın group by dan sonra order by Ad dersın sıralama yapar
hiçbir konusma yapmayanlarda ztn sonucu 0 olarak donduruyor mesela metın sehıriçi 124 saniye ,şehir dısı 900 saniye ve gsm de hiç konusma yapmadıgı ıcın 0 saniye degerını almış
Allah razy olsun hocam.
Ellerinize saglik, oldukça güze hazirlanmis örnekler. Örnek çesitlemesinin artmasi dilegi ile basarilarinizin devamini dilerim
elinize saglik anlasilir sade harika örneklerin devamini istiyoruz
Tesekkürler mevlüt. Sen buralara gelirmiydin 🙂
Sendende paylasimlar bekleriz:)
helal sabri eline saglik güzel paylasim
Elinize saglik çok faydasi oldu.
cok güzel olmus anlatirken mümkün oldugu kadar yeni baslayanlari göz önüne alarak anlatinca
daha iyi oluyo elinize saglik.
süper
Bu örnek için bende çok tesekür ederim. Çok faydali bir anlatim oldu.
çok faydalandim hocam sagolasin
Tesekkurler Hocam, anlatmak icin guzel ornek secmisiniz. iyi calismalar.
hata duzeltildi yeniden tesekkur ederim.
aynen öyle:) yazarken yanlislik yapmisiz. duzeltme icin tesekkur ederim
SUM(case when k.Yon =1 then k.Saniye else 0 end) as SehirlerArasi,
SUM(case when k.Yon =1 then k.Saniye else 0 end) as GSM
Yukaridaki k.Yon ler sirasi ile 2 ve 3 olmali galiba
gayet güzel olmus ve çok yardimci oldu tesekkürler
çok ise yarayabilecek bilgi tesekkürler