Yazılım Mimarileri ve Tasarım Desenleri Üzerine

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 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.')

Mobil sürümden çık