MS SQL Virgül ile Ayrılmış Verileri Satır Yapma

MS SQL Virgül ile Ayrılmış Verileri Satır Yapma

MS SQL de bazı durumlarda verileri satırlara yazmak yerine (parent-child tablo oluşturmak yerine) bir alana genellikle virgül veya başka karakterler ile veriyi ayırarak girmeyi tercih edebiliriz. Örneğin etiket (tag) gibi bir veri setini bir alana virgüller ile doldurabiliriz. Söz konusu bu veriyi satırlara dönüştürerek kullanmak gerekirse SQL de Cross Apply kullanarak yapabiliriz.

Aşağıdaki örneğimizde ülkemizin bölgelerinin karşısına şehirleri virgül ile ayırarak Şehir alanına gireceğiz. Daha sonra her bir şehrimizi alt alta satır verisine dönüştüreceğiz. Böylece şehir isiminden başka tablolarda bulunan şehirleri eşleştirerek bölgeleri getirebiliriz.

Öncelikle örnek bir veri seti için geçici bir tablo oluşturalım.

SELECT AS ID, 'AKDENİZ BÖLGESİ' AS BOLGE, 'ADANA, ANTALYA, BURDUR, HATAY, ISPARTA, KAHRAMANMARAŞ, MERSİN, OSMANİYE' AS SEHIR
INTO #TABLO 
UNION
SELECT AS ID, 'DOĞU ANADOLU BÖLGESİ' AS BOLGE, 'AĞRI, ARDAHAN, BİNGÖL, BİTLİS, ELAZIĞ, ERZİNCAN, ERZURUM, HAKKARİ, IĞDIR, KARS, MALATYA, MUŞ, TUNCELİ, VAN' AS SEHIR
UNION
SELECT 3 AS ID, 'EGE BÖLGESİ' AS BOLGE, 'AFYON, AYDIN, DENİZLİ, İZMİR, KÜTAHYA, MANİSA, MUĞLA, UŞAK' AS SEHIR
UNION
SELECT AS ID, 'GÜNEYDOĞU BÖLGESİ' AS BOLGE, 'ADIYAMAN, BATMAN, DİYARBAKIR, GAZİANTEP, KİLİS, MARDİN, SİİRT, ŞANLIURFA, ŞIRNAK' AS SEHIR
UNION
SELECT 5 AS ID, 'İÇ ANADOLU BÖLGESİ' AS BOLGE, 'AKSARAY, ANKARA, ÇANKIRI, ESKİŞEHİR, KARAMAN, KAYSERİ, KIRIKKALE, KIRŞEHİR, KONYA, NEVŞEHİR, NİĞDE, SİVAS, YOZGAT' AS SEHIR
UNION
SELECT AS ID, 'KARADENİZ BÖLGESİ' AS BOLGE, 'AMASYA, ARTVİN, BARTIN, BAYBURT, BOLU, ÇORUM, DÜZCE, GİRESUN, GÜMÜŞHANE, KARABÜK, KASTAMONU, ORDU, RİZE, SAMSUN, SİNOP, TOKAT, TRABZON, ZONGULDAK' AS SEHIR
UNION
SELECT AS ID, 'MARMARA BÖLGESİ' AS BOLGE, 'BALIKESİR, BİLECİK, BURSA, ÇANAKKALE, EDİRNE, İSTANBUL, KIRKLARELİ, KOCAELİ, SAKARYA, TEKİRDAĞ, YALOVA' AS SEHIR

Oluşturulan tablo aşağıdaki gibidir.

SELECT FROM #TABLO

ID BOLGE SEHIR
1 AKDENİZ BÖLGESİ ADANA, ANTALYA, BURDUR, HATAY, ISPARTA, KAHRAMANMARAŞ, MERSİN, OSMANİYE
2 DOĞU ANADOLU BÖLGESİ AĞRI, ARDAHAN, BİNGÖL, BİTLİS, ELAZIĞ, ERZİNCAN, ERZURUM, HAKKARİ, IĞDIR, KARS, MALATYA, MUŞ, TUNCELİ, VAN
3 EGE BÖLGESİ AFYON, AYDIN, DENİZLİ, İZMİR, KÜTAHYA, MANİSA, MUĞLA, UŞAK
4 GÜNEYDOĞU BÖLGESİ ADIYAMAN, BATMAN, DİYARBAKIR, GAZİANTEP, KİLİS, MARDİN, SİİRT, ŞANLIURFA, ŞIRNAK
5 İÇ ANADOLU BÖLGESİ AKSARAY, ANKARA, ÇANKIRI, ESKİŞEHİR, KARAMAN, KAYSERİ, KIRIKKALE, KIRŞEHİR, KONYA, NEVŞEHİR, NİĞDE, SİVAS, YOZGAT
6 KARADENİZ BÖLGESİ AMASYA, ARTVİN, BARTIN, BAYBURT, BOLU, ÇORUM, DÜZCE, GİRESUN, GÜMÜŞHANE, KARABÜK, KASTAMONU, ORDU, RİZE, SAMSUN, SİNOP, TOKAT, TRABZON, ZONGULDAK
7 MARMARA BÖLGESİ BALIKESİR, BİLECİK, BURSA, ÇANAKKALE, EDİRNE, İSTANBUL, KIRKLARELİ, KOCAELİ, SAKARYA, TEKİRDAĞ, YALOVA

Şehir alanında virgül ile ayrılmış Şehirleri alt alta veri setine dönüştürecek T-SQL sorgusu:

SELECT ID, BOLGE, LTRIM(SPLIT.SEHIR.value('.', 'NVARCHAR(20)')) AS SEHIR 
FROM
(SELECT ID, BOLGE, CAST ('<M>' + REPLACE(SEHIR, ',', '</M><M>') + '</M>' AS XML) AS SEHIRLER 
FROM #TABLO) AS A1 
CROSS APPLY SEHIRLER.nodes ('/M'AS SPLIT(SEHIR) 

ID BOLGE SEHIR
1 AKDENİZ BÖLGESİ ADANA
1 AKDENİZ BÖLGESİ ANTALYA
1 AKDENİZ BÖLGESİ BURDUR
1 AKDENİZ BÖLGESİ HATAY
1 AKDENİZ BÖLGESİ ISPARTA
1 AKDENİZ BÖLGESİ KAHRAMANMARAŞ
1 AKDENİZ BÖLGESİ MERSİN
1 AKDENİZ BÖLGESİ OSMANİYE
2 DOĞU ANADOLU BÖLGESİ AĞRI
2 DOĞU ANADOLU BÖLGESİ ARDAHAN
2 DOĞU ANADOLU BÖLGESİ BİNGÖL
2 DOĞU ANADOLU BÖLGESİ BİTLİS
2 DOĞU ANADOLU BÖLGESİ ELAZIĞ
2 DOĞU ANADOLU BÖLGESİ ERZİNCAN
2 DOĞU ANADOLU BÖLGESİ ERZURUM
2 DOĞU ANADOLU BÖLGESİ HAKKARİ
2 DOĞU ANADOLU BÖLGESİ IĞDIR
2 DOĞU ANADOLU BÖLGESİ KARS
2 DOĞU ANADOLU BÖLGESİ MALATYA
2 DOĞU ANADOLU BÖLGESİ MUŞ
2 DOĞU ANADOLU BÖLGESİ TUNCELİ
2 DOĞU ANADOLU BÖLGESİ VAN
3 EGE BÖLGESİ AFYON
3 EGE BÖLGESİ AYDIN
3 EGE BÖLGESİ DENİZLİ
3 EGE BÖLGESİ İZMİR
3 EGE BÖLGESİ KÜTAHYA
3 EGE BÖLGESİ MANİSA
3 EGE BÖLGESİ MUĞLA
3 EGE BÖLGESİ UŞAK
4 GÜNEYDOĞU BÖLGESİ ADIYAMAN
4 GÜNEYDOĞU BÖLGESİ BATMAN
4 GÜNEYDOĞU BÖLGESİ DİYARBAKIR
4 GÜNEYDOĞU BÖLGESİ GAZİANTEP
4 GÜNEYDOĞU BÖLGESİ KİLİS
4 GÜNEYDOĞU BÖLGESİ MARDİN
4 GÜNEYDOĞU BÖLGESİ SİİRT
4 GÜNEYDOĞU BÖLGESİ ŞANLIURFA
4 GÜNEYDOĞU BÖLGESİ ŞIRNAK
5 İÇ ANADOLU BÖLGESİ AKSARAY
5 İÇ ANADOLU BÖLGESİ ANKARA
5 İÇ ANADOLU BÖLGESİ ÇANKIRI
5 İÇ ANADOLU BÖLGESİ ESKİŞEHİR
5 İÇ ANADOLU BÖLGESİ KARAMAN
5 İÇ ANADOLU BÖLGESİ KAYSERİ
5 İÇ ANADOLU BÖLGESİ KIRIKKALE
5 İÇ ANADOLU BÖLGESİ KIRŞEHİR
5 İÇ ANADOLU BÖLGESİ KONYA
5 İÇ ANADOLU BÖLGESİ NEVŞEHİR
5 İÇ ANADOLU BÖLGESİ NİĞDE
5 İÇ ANADOLU BÖLGESİ SİVAS
5 İÇ ANADOLU BÖLGESİ YOZGAT
6 KARADENİZ BÖLGESİ AMASYA
6 KARADENİZ BÖLGESİ ARTVİN
6 KARADENİZ BÖLGESİ BARTIN
6 KARADENİZ BÖLGESİ BAYBURT
6 KARADENİZ BÖLGESİ BOLU
6 KARADENİZ BÖLGESİ ÇORUM
6 KARADENİZ BÖLGESİ DÜZCE
6 KARADENİZ BÖLGESİ GİRESUN
6 KARADENİZ BÖLGESİ GÜMÜŞHANE
6 KARADENİZ BÖLGESİ KARABÜK
6 KARADENİZ BÖLGESİ KASTAMONU
6 KARADENİZ BÖLGESİ ORDU
6 KARADENİZ BÖLGESİ RİZE
6 KARADENİZ BÖLGESİ SAMSUN
6 KARADENİZ BÖLGESİ SİNOP
6 KARADENİZ BÖLGESİ TOKAT
6 KARADENİZ BÖLGESİ TRABZON
6 KARADENİZ BÖLGESİ ZONGULDAK
7 MARMARA BÖLGESİ BALIKESİR
7 MARMARA BÖLGESİ BİLECİK
7 MARMARA BÖLGESİ BURSA
7 MARMARA BÖLGESİ ÇANAKKALE
7 MARMARA BÖLGESİ EDİRNE
7 MARMARA BÖLGESİ İSTANBUL
7 MARMARA BÖLGESİ KIRKLARELİ
7 MARMARA BÖLGESİ KOCAELİ
7 MARMARA BÖLGESİ SAKARYA
7 MARMARA BÖLGESİ TEKİRDAĞ
7 MARMARA BÖLGESİ YALOVA


İlgili Yazılar