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 1 AS ID, 'AKDENİZ BÖLGESİ' AS BOLGE, 'ADANA, ANTALYA, BURDUR, HATAY, ISPARTA, KAHRAMANMARAŞ, MERSİN, OSMANİYE' AS SEHIR
INTO #TABLO
UNION
SELECT 2 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 4 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 6 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 7 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 |