Решение for xml
(которое было заменено на string_agg
в 2017 году и далее) выглядит следующим образом:
declare @person table(pid int, pname varchar(100));
declare @transaction table(pid int, skuid int);
declare @sku table(skuid int, skuname varchar(100));
insert into @person values(1,'Person 1'),(2,'Person 2'),(3,'Person 3')
insert into @transaction values(1,1),(1,2),(1,3),(1,4),(2,2),(2,4);
insert into @sku values(1,'Prod 1'),(2,'Prod 2'),(3,'Prod 3'),(4,'Prod 4'),(5,'Prod 5'),(6,'Prod 6');
select p.pid
,p.pname
,stuff((select ', ' + s.skuname
from @transaction as t
join @sku as s
on t.skuid = s.skuid
where p.pid = t.pid
order by s.skuname
for xml path('')
),1,2,'') as ReportField
from @person as p
group by p.pid
,p.pname
order by p.pname;
выход
+-----+----------+--------------------------------+
| pid | pname | ReportField |
+-----+----------+--------------------------------+
| 1 | Person 1 | Prod 1, Prod 2, Prod 3, Prod 4 |
| 2 | Person 2 | Prod 2, Prod 4 |
| 3 | Person 3 | NULL |
+-----+----------+--------------------------------+