Transact Sql(Union,Union All-With Rollup-With Cube-Case,When,Else,End-With Ties-With-Subquery)
Bu yazımızda da T-SQL’e devam ediyoruz.Transact Sql de yardımcı olacak bir çok teferruata değinelim.
UNION – UNION ALL
Birden fazla select sorgusunun sonucunu tek seferde alt alta göstermemize yarar.Örneğin,tablonun birinde 5 diğerinde 7 kayıt geliyorsa,bunları tek tablo halinde 12 kayıt olarak gösterir.
select Adi from Personeller union select Soyadi from Personeller
Dikkat etmemiz gereken koşullar;
- Union sorgusunun sonucunda oluşan tablonun kolon isimleri, üstteki sorgunun kolon isimlerinden oluşturulur.
- Üstteki sorgudan kaç kolon çekilmişse alttaki sorgudan da o kadar çekilmek zorundadır.
- Üstteki sorgudan çekilen kolonların tipleriyle,alttaki sorgudan çekilen kolonların tipleriyle uyumlu olmalıdır.
- Joinler yan yana,Union alt alta birleştirir.Joinlerde belirli bir kolon üzerinden birleştirirken,Union da böyle bir durum yoktur.
- Union tekrarlı kayıtları getirmez.Tekrarlı kayıtları getirmek için Union All komutu kullanılmalıdır.
Union da kullanılan tablolara kolon eklenebilir.Dikkat etmemiz gereken nokta aşağıyada yukarıyada aynı kolondan eklememizdir.
select SirketAdi,Telefon,'Nakliyeci' from Nakliyeciler union select MusteriAdi,Telefon,'Müşteri' from Musteriler
WITH ROLLUP, WITH CUBE
WITH ROLLUP : group by ile gruplanmış veri kümesinde ara toplam alınmasını sağlar.
WITH CUBE : group by ile gruplanmış veri kümesinde teker teker toplam alınmasını sağlar.
select SatisID,UrunID,SUM(Miktar) from [Satis Detaylari] where SatisID < 10251 group by SatisID,UrunID with rollup select SatisID,UrunID,SUM(Miktar) from [Satis Detaylari] where SatisID < 10251 group by SatisID,UrunID with rollup having SUM(Miktar)>40 and SatisID is not null
Dikkat ettiyseniz group by dan hemen sonra kullanıyoruz.
select SatisID,UrunID,SUM(Miktar) from [Satis Detaylari] where SatisID < 10251 group by SatisID,UrunID with cube having SatisId is null and UrunID = 51 order by SatisID,UrunId
CASE – WHEN – ELSE – END
Personellerimin isim ve soyisiminin yanında, UnvanEki Mr. ise ERKEK, Mrs. ya da Ms. ise KADIN yazsın.
select case when UnvanEki = 'Mrs.' or UnvanEki = 'Ms.' then 'Kadın' when UnvanEki = 'Mr.' then 'Erkek' else UnvanEki end from Personeller
Eğer ürünümün birim fiyatı 0 – 50 arası ise ÇİN MALI, 50 – 100 arası ise UCUZ, 100 – 200 arası ise NORMAL , 200 den fazla ise PAHALI yazsın.
select UrunAdi, case when BirimFiyati between 0 and 50 then 'ÇÝN MALI' when BirimFiyati between 50 and 100 then 'UCUZ' when BirimFiyati between 100 and 200 then 'NORMAL' when BirimFiyati >200 then 'PAHALI' else convert(nvarchar(40),BirimFiyati) end as 'Durum'—Bu kolona isim verir. from Urunler
WITH TIES
select top 6 * from [Satis Detaylari]
Yukarıdaki yapıda “Satis Detayları” adlı tablodan ilk 6 veri gelecektir.Ancak bu verilerden sonuncu olanı “10250” nolu kayıtın iki adeti dışarda kalmaktadır.Bu ikisinide getirmek için “WITH TIES” yapısını kullanmaktayız.
With Ties order by ile sıralanmış kolonda, en son kayda bakar, eğer onun altında aynı nolu kayıt varsa onu da getirir.
Bu yapıyı kullanabilmek için tek şart order by kullanılmalıdır.
select top 6 with ties * from [Satis Detaylari] order by SatisID
WITH
Bu yapıyla ilgili direkt bir örnek sunuyorum ve incelemenizi tavsiye ediyorum.
with sonuc(isim,id) as ( select Musteriler.MusteriAdi,Satislar.SatisID from Musteriler inner join Satislar on Musteriler.MusteriID=Satislar.MusteriID ) select sonuc.isim,sonuc.id from sonuc inner join [Satis Detaylari] on sonuc.id=[Satis Detaylari].SatisID
SUBQUERY(İÇ İÇE SORGU YAZMA TEKNİĞİ)
Bazı durumlarda iç içe sorgu yazmamız gerekebilir.Bu durumda Subquery tekniğini kullanmalıyız.
Adı Nancy olan personelimin yaptığı satışlar ve Nakliye Ücretleri ?
Bu soruyu ilk önce inner join ile yapalım.
select Satislar.SatisID,Satislar.NakliyeUcreti from Personeller inner join Satislar on Personeller.PersonelID=Satislar.PersonelID where Personeller.Adi='nancy'
Şimdide subquery yöntemiyle yapalım..
select SatisID,NakliyeUcreti from Satislar where PersonelID =(select PersonelID from Personeller where Adi = 'nancy')
Aradaki farkı görebiliyorsunuzdur.Subquery tekniğini kullanarakta,inner joinle yaptıklarımızı yapabiliriz.
UnvanEki doktor olan çalışanımın yapmış olduğu satışlar (Personeller, Satislar)
select SatisID from Satislar where PersonelID=(select PersonelID from Personeller where UnvanEki='Dr.')
