Merhaba,
İhtiyaçlarımız gereği bazen verilerimizi tek sütunda göstermemiz gerekebiliyor. Özellikle raporlarda datayı satır bazında çoklama yapmaması için ya da tek bir satırda ve sütunlarda tüm verileri görebilmek için ihtiyacımız olabilir. Bu ihtiyacımızı karşılaması için STRING_AGG işlevi ihtiyacımızı görmektedir. Ancak STRING_AGG kullanabilmek için SQL Server 2017 ve daha üst bir sürümü olması gerekmektedir.
Örnek Çalışma;
Mevcutta Öğrencilerin notlarının olduğu bir data mevcut. Burada göreceğiniz üzere her bir öğrenci için 3’er satır bulunmakta. Dersler ve notlar sütunundan kaynaklı datamız satır bazında çoklama yapmış. Burada tabi ki pivot yapıp Dersleri ayrı sütunlara bölüp notlarını ayrı sütunlarda göstererek de datamızı tekilleştirebilirdik. Ancak bu örneğimizde STRING_AGG işlevini göreceğimiz için bu şekilde bir çalışma yapmayacağız.
Tek bir sütunda virgülle ayırarak ya da istediğimiz ayraçları kullanarak değerlerimizi yan yana getirebiliriz.
Kullanımı çok basit. İşlev 2 parametre almaktadır. Birincisi “notlar” yazan Kısıma birleştirme yapacağını alanı yazıyoruz yani expression alanını. İkinci parametre ise separator alanı. Yani birleştirilecek değerleri ne ile ayırmak istiyorsanız onu yazmanız gerekiyor. ORDER BY ID alanı ile de ID ye göre sıralamakta. Tabi Group by ile kullanılması gerekmektedir. Gruplayıp birleştirme işlemi yaptığı için.
1 |
STRING_AGG(notlar, ‘ , ‘) WITHIN GROUP (ORDER BY ID) AS Notlar |
Eğer isterseniz başına sabit bir ifade ekleyipte kullanabilirsiniz.
1 |
‘Notlar: ‘ + STRING_AGG(notlar, ‘ , ‘) WITHIN GROUP (ORDER BY ID) AS Notlar |
Sorgunun tam hali aşağıdaki gibidir;
1 2 3 4 5 6 7 8 9 10 11 |
Use TestDB SELECT ID ,Ad ,STRING_AGG(notlar, ‘ , ‘) WITHIN GROUP (ORDER BY ID) AS Notlar ,STRING_AGG(dersler, ‘ – ‘) WITHIN GROUP (ORDER BY ID) AS Dersler ,‘Notlar: ‘ + STRING_AGG(notlar, ‘ , ‘) WITHIN GROUP (ORDER BY ID) AS Notlar FROM dbo.OgrenciNotlari_unpivot GROUP BY ID ,Ad ORDER BY 1 |
Eğer isterseniz aşağıdaki şekilde de kullanabilirsiniz;
1 2 3 4 5 6 7 8 |
Use TestDB SELECT Ad ,STRING_AGG(notlar, ‘ , ‘) AS Notlar FROM dbo.OgrenciNotlari_unpivot GROUP BY Ad ORDER BY 1 |
Çıktısı;