15 Mart 2010 Pazartesi

MS Sql : Kolondaki veriyi virgülle ayrılmış satıra dönüştürmek.
(Comma Separated Values (CSV) from Table Column)

Geçenlerde gelen bir talep üzerine böyle bir şeye ihtiyaç duydum. Örnek ile açıklamak gerekirse;

Create table CRM_CON
(
   CONID int identity(1,1) primary key,
   CNAME nvarchar(50)

)

Create table CRM_GRP
(
  GRPID int identity(1,1) primary key,
  GDEFN nvarchar(50)
)

Create table CRM_GRPTR
(
  GTRID int identity(1,1) primary key,
  CONID int,
  GRPID int
)

insert into CRM_CON values ('Umut')

insert into CRM_GRP values ('Destek')
insert into CRM_GRP values ('Yazılım')
insert into CRM_GRP values ('Genel')

insert into CRM_GRPTR values (1,1)
insert into CRM_GRPTR values (1,2)
insert into CRM_GRPTR values (1,3)

Şeklinde bire çok ilişkili iki tablomuz olsun. İstenen veri formatı ;

AD       Gruplar

Umut | Yazılım,Genel,Destek |

Böyle bir durumda kullanıcının gruplarını bir sub query ile çektiğimizi varsayalım. CRM_GRP tablosundan gelecek olan veri birden fazla olduğundan bu formatta yazdırmak olanaksız görünüyordu.

Tabiki veri, kod tarafında işlenerek bu formata dönüştürülebilir. Fakat sorgunuz direk olarak rapora gidiyorsa veya bir şekilde işleyemeyeceğiniz bir durumda ise ihtiyaç bu noktada başlıyor.

Ben ilk olarak içerisinde kursor barındıran bir fonksiyon yazmayı düşündüm. Nvarchar bir değişkene kolondaki veriyi ekleyip bu değişkeni fonksiyondan döndürmek bana mantıklı geldi. Fakat işlem başarız oldu. Daha sonra biraz araştırmadan sonra daha akıllıca bir yöntem buldum ve sizlerle paylaşmak istiyorum.

SELECT c.CNAME,

(SELECT SUBSTRING((SELECT ',' + g.GDEFN
FROM CRM_GRP g
WHERE g.GRPID in (SELECT GRPID FROM CRM_GRPTR gtr WHERE gtr.CONID=c.CONID)
ORDER BY g.GDEFN
FOR XML PATH('')),2,200000) )AS CSV

FROM CRM_CON c



Umarım faydalı olur.




2 yorum:

  1. Hocam birde merak ettigim, yapmak istedigim, verileri virgulle ayirmak yerine ayri kolonlarda yan yana nasil gosterebilirim ?

    YanıtlaSil
    Yanıtlar
    1. stackoverflow.com/questions/5123585/how-to-split-a-single-column-values-to-multiple-column-values

      Buraya bir göz atın. Geç oldu ama umarım işinize yarar.

      Sil