16

Necesito escribir una consulta sql en la tabla para que el resultado tenga el grupo por columna junto con la columna agregada con separadores de coma.Consulta SQL para obtener resultados agregados en separadores de coma junto con grupo por columna en SQL Server

Mi mesa estaría en el siguiente formato

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

Resultado esperado debe estar en el siguiente formato

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

En MySQL, debería utilizar GROUP_CONCAT. Consulte esta pregunta para ver un ejemplo de cómo simular eso en el servidor SQL: http://stackoverflow.com/questions/451415/simulating-group-concat-mysql-function-in-ms-sql-server-2005 –

+0

+1 en 'cross apply' como dice @Eric Petroelje. Es la manera de hacerlo. –

Respuesta

22

que desea utilizar FOR XML PATH construcción:

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 

La función STUFF es deshacerse de los principales ', '.

También puede ver otros ejemplos aquí:

+0

+1 para su solución. Del mismo modo, podemos hacerlo utilizando cross-apply también. ¿Cuál sería la mejor forma de rendimiento? – suryakiran

+0

Acepta la respuesta, pero necesita la mejor manera de realizar la operación. – suryakiran

0

Sólo por un punto de vista equilibrado, también se puede hacer esto con un CTE pero su no tan bueno como el método de aplicar la cruz, no creo. He codificado esto del casco para disculpas si no funciona.

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 
Cuestiones relacionadas