Consulta SQL para obter resultado agregado em separadores de vírgula junto com grupo por coluna no SQL Server

Eu preciso escrever uma consulta sql na tabela de tal forma que o resultado teria o grupo por coluna, juntamente com a coluna agregada com separadores por vírgula.

Minha tabela estaria no formato abaixo

|`````````|````````| | ID | Value | |_________|________| | 1 | a | |_________|________| | 1 | b | |_________|________| | 2 | c | |_________|________| 

O resultado esperado deve estar no formato abaixo

  |`````````|````````| | ID | Value | |_________|________| | 1 | a,b | |_________|________| | 2 | c | |_________|________| 

    Você deseja usar a construção FOR XML PATH :

     select ID, stuff((select ', ' + Value from YourTable t2 where t1.ID = t2.ID for xml path('')), 1,2,'') [Values] from YourTable t1 group by ID 

    A function STUFF é livrar-se do líder ', ' .

    Você também pode ver outros exemplos aqui:

    • A mesma unidade SQL entre duas tabelas precisa de números de pedidos em 1 célula
    • SQL e Coldfusion deixaram as tabelas de junit obtendo resultados duplicados como uma lista em uma coluna

    Apenas para uma visão balanceada, você também pode fazer isso com um CTE, mas não é tão bom quanto o método cross-apply que eu não acho. Eu codifiquei isso do casco, então peço desculpas se não funcionar.

     WITH CommaDelimitedCTE (RowNumber,ID,[Value],[Values]) AS ( SELECT 1,MT.ID , MIN(MT.Value), CAST(MIN(MT.Value) AS VARCHAR(8000)) FROM MyTable MT GROUP BY MT.ID UNION ALL SELECT CT.RowNumber + 1, MT.ID, MT.Value, CT.[Values] + ', ' + MT.Value FROM MyTable MT INNER JOIN CommaDelimitedCTE CT ON CT.ID = MT.ID WHERE MT.[Value] > CT.[Value] ) Select CommaDelimitedCTE.* from CommaDelimitedCTE INNER JOIN (SELECT MT.ID,MAX(RowNumber) as MaxRowNumber from CommaDelimitedCTE GROUP BY MT.ID) Q on Q.MT.ID = CommaDelimitedCTE.MT.ID AND Q.MaxRowNumber = CommaDelimitedCTE.RowNumber