La respuesta elegida de @ OlegDok de puede devolver el resultado correcto. Pero el rendimiento puede ser terrible. Este escenario de prueba lo ilustrará.
Creación de una tabla temporal:
CREATE table #temp (EmpId INT, EmpName VARCHAR(100))
;WITH N(N)AS
(SELECT 1 FROM(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))M(N)),
tally(N)AS(SELECT ROW_NUMBER()OVER(ORDER BY N.N)FROM N,N a,N b,N c,N d,N e,N f)
INSERT #temp
SELECT EmpId, EmpName FROM (values(1, 'Mary'),(1, 'John'),(1, 'Sam')) x(EmpId, EmpName)
CROSS APPLY
(SELECT top 2000 N FROM tally) y
UNION ALL
SELECT EmpId, EmpName FROM (values(2, 'Alaina'),(2, 'Edward')) x(EmpId, EmpName)
CROSS APPLY
(SELECT top 2000 N FROM tally) y
Ésta es sólo 10.000 filas. Pero muchos EmpId idénticos.
Esta consulta en la respuesta de Oleg tomó 64 segundos en mi base de datos.
SELECT distinct
EmpId,
(
SELECT EmpName+','
FROM #temp t2
WHERE t2.EmpId = t1.EmpId
FOR XML PATH('')
) Concatenated
FROM #temp t1
Distinto no es la manera correcta de limpiar filas en esta situación. Para evitar esta unión cartesiana, reduzca la cantidad inicial de ID antes de unirse de esta manera.
Esta es la forma correcta de manejar esto:
;WITH CTE as
(
SELECT distinct EmpId
FROM #temp
)
SELECT
EmpId,
STUFF((
SELECT ','+EmpName
FROM #temp t2
WHERE t2.EmpId = t1.EmpId
FOR XML PATH('')
), 1,1,'') Concatenated
FROM CTE t1
Esto toma menos de 1 segundo
Qué SQL Versión del servidor?¿Miraste http://stackoverflow.com/questions/451415/simulating-group-concat-mysql-function-in-ms-sql-server-2005 – BartekR
Estoy usando sql server 2008 @ BartekR – Gurvinder
@OlegDok como soy nuevo en sql He intentado esa publicación pero estoy confundido por column_names en eso ... :( – Gurvinder