Reputation: 2700
I have the following table:
create table #prd
(
ver varchar(20),
fam varchar(20),
mm varchar(20),
)
insert into #prd values('dt','fam1','111')
insert into #prd values('dt','fam1','222')
insert into #prd values('mb','fam1','333')
insert into #prd values('mb','fam2','444')
I need the output as below using CTE:
ver family MM
------- --------- ----------
DT fam1 111,222
mb fam1 333
mb fam2 444
Please help!!
Upvotes: 3
Views: 426
Reputation: 138990
A CTE version that does not use for xml path('')
;with cte1 as
(
select *,
row_number() over(partition by ver, fam order by mm) as rn
from #prd
),
cte2 as
(
select ver,
fam,
cast(mm as varchar(max)) as mm,
rn
from cte1
where rn = 1
union all
select c1.ver,
c1.fam,
c2.mm+','+c1.mm,
c1.rn
from cte1 as c1
inner join cte2 as c2
on c1.rn = c2.rn + 1 and
c1.ver = c2.ver and
c1.fam = c2.fam
),
cte3 as
(
select ver,
fam,
mm,
row_number() over(partition by ver, fam order by rn desc) as rn
from cte2
)
select ver,
fam,
mm
from cte3
where rn = 1
Upvotes: 3
Reputation: 2499
You can use a user defined function that takes the "ver" as a parameter and return the MM comma separated or u can use data
Upvotes: 0
Reputation: 22204
You don't need a CTE. Here's a solution that doesn't use the CTE
SELECT ver, fam,
STUFF((
SELECT ', ' + mm
FROM #prd AS prd
WHERE p.ver = prd.ver
AND p.fam = prd.fam
ORDER BY mm
FOR XML PATH('')
), 1, 2, '') AS MM
FROM #prd AS p
GROUP BY ver, fam
If you need it to be a CTE, try this
;WITH prd_CTE AS
(
SELECT ver, fam,
STUFF((
SELECT ', ' + mm
FROM #prd AS prd
WHERE p.ver = prd.ver
AND p.fam = prd.fam
ORDER BY mm
FOR XML PATH('')
), 1, 2, '') AS MM
FROM #prd AS p
GROUP BY ver, fam
)
SELECT *
FROM prd_CTE
Upvotes: 5