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.
Hocam birde merak ettigim, yapmak istedigim, verileri virgulle ayirmak yerine ayri kolonlarda yan yana nasil gosterebilirim ?
YanıtlaSilstackoverflow.com/questions/5123585/how-to-split-a-single-column-values-to-multiple-column-values
SilBuraya bir göz atın. Geç oldu ama umarım işinize yarar.