Salı , 19 Haziran 2018

T-SQL ile Gruplanan Değerlerin Birleştirilmesi

Verilerimiz üzerinde gruplama işlemi yaparken Group by ifadesini kullanıyoruz. Group by ile verilerimizi gruplayabildiğimiz gibi aynı zamanda Sum gibi gruplama fonksiyonlarını kullanarak gruplama yaptığımız seviyedeki verilerinde toplamlarını alabiliriz. Fakat Sum fonksiyonu ile sadece numerik verilerin toplandığını biliyoruz. Bazen gruplama yaptığımızda alanlar dışında kalan numerik ya da numerik olmayan alanların toplanmasını değil birleştirilmesini isteriz. Örneğin bir tabloda öğrencilerin numaraları ve aldıkları derslerin adlarının tutulduğunu varsayalım. bu durumda her öğrencinin numarasını ve aldığı dersi veya dersleri aralarına bir ayıraç koyarak gruplayabilir miyiz? İlk bakışta Oracle’daki Wm_Contact veya MySQL’deki  GROUP_CONCAT fonksiyonlarının SQL Server tarafında maalesef şimdilik karşılıkları yok. Fakat bu işlemi SQL Serverın bize sunmuş olduğu For XML PATH komutuyla yapabiliriz. Şimdi yukaırdaki senaryomuzu örneğe dökelim. İlk adım olarak örnek tablomuzu oluşturup verilerimizi ekleyelim.

 
CREATE TABLE #Ders(OgrenciID INT,DersAd VARCHAR(50))

INSERT INTO #Ders VALUES (1,’Matematik’)

INSERT INTO #Ders VALUES (1,’Fizik’)

INSERT INTO #Ders VALUES (1,’Kimya’)

INSERT INTO #Ders VALUES (2,’Kimya’)

INSERT INTO #Ders VALUES (3,’Bilgisayar’)

INSERT INTO #Ders VALUES (3,’Resim’)

INSERT INTO #Ders VALUES (4,’Kimya’)

INSERT INTO #Ders VALUES (4,’Fizik’)

INSERT INTO #Ders VALUES (4,’Bilgisayar’)

INSERT INTO #Ders VALUES (4,’Resim’)

SELECT * FROM #Ders

Tablomuz aşağıdaki gibi olacaktır.

table1

Gruplama için sorgumuzu yazarken SQL Server 2005 sürümüyle sunulan FOR XML PATH komutunu kullanacağız. FOR XML PATH komutu en basit haliyle tablomuzdaki verilerimizin bize XML formatında döndürülmesini sağlar.

SELECT DISTINCT OgrenciID,(

SELECT DersAd+’,’ FROM #Ders d1

WHERE d1.OgrenciID=d2.OgrenciID

FOR XML PATH(”)) Dersler

FROM #Ders d2

table2

Sorgumuzun sonucunu incelediğimizde her öğrencinin aldığı derslerin öğrenci numarası bilgisinin karşısına aralarına virgül konarak sıralandığı görebiliriz. Fakat her satırın sonunda fazladan bir tane virgül işareti bulunmaktadır. Bu sorunu çözmek için de Substring,Left veya Stuff fonksiyonlarından birinden yararlanabiliriz.

SELECT OgrenciID,LEFT(Dersler,LEN(dersler)-1) FROM (

SELECT DISTINCT OgrenciID,(

SELECT DersAd+’,’ FROM #Ders d1

WHERE d1.OgrenciID=d2.OgrenciID

FOR XML PATH(”)) Dersler

FROM #Ders d2

) data

table3

 

Hakkında ismailadar

Cevapla

E-posta adresiniz yayınlanmayacak. Required fields are marked *

*


*

Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>