Implémentation de CTE

J'ai le tableau suivant:

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') 

J'ai besoin de la sortie comme ci-dessous en utilisant CTE:

 ver family MM ------- --------- ---------- DT fam1 111,222 mb fam1 333 mb fam2 444 

S'il vous plaît aider !!

Une version CTE qui n'est pas utilisée 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 

Vous n'avez pas besoin d'un CTE. Voici une solution qui n'utilise pas le 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 

Si vous avez besoin d'un CTE, essayez ceci

 ;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 

Vous pouvez utiliser une fonction définie par l'user qui prend le "ver" comme un paramètre et renvoyer la virgule MM séparés ou vous pouvez utiliser des données