Sql Server da Case Fonksiyonu ve Kullanim Örnekleri

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.

18 thoughts on “Sql Server da Case Fonksiyonu ve Kullanim Örnekleri

  1. 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

    1. 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ış

  2. Ellerinize saglik, oldukça güze hazirlanmis örnekler. Örnek çesitlemesinin artmasi dilegi ile basarilarinizin devamini dilerim

  3. cok güzel olmus anlatirken mümkün oldugu kadar yeni baslayanlari göz önüne alarak anlatinca

    daha iyi oluyo   elinize saglik.

  4. 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

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir