Así es como funciona:
Agregar FOR XML PATH al final de una consulta le permite generar los resultados de la consulta como elementos XML, con el nombre del elemento contenido en el argumento PATH. Por ejemplo, si tuviéramos que ejecutar la siguiente instrucción:
SELECT ',' + name
FROM temp1
FOR XML PATH ('')
Al pasar una cadena en blanco (FOR XML PATH('')), obtenemos lo siguiente:
,aaa,bbb,ccc,ddd,eee
La declaración STUFF literalmente "rellena" una cadena dentro de otra, reemplazando caracteres dentro de la primera cadena. Sin embargo, la estamos usando simplemente para eliminar el primer carácter de la lista de valores resultante.
SELECT abc = STUFF((
SELECT ',' + NAME
FROM temp1
FOR XML PATH('')
), 1, 1, '')
FROM temp1
Los parámetros de STUFF
son:
- La cadena que se va a "rellenar" (en nuestro caso, la lista completa de nombres con una coma inicial)
- La ubicación para comenzar a eliminar e insertar caracteres (1, estamos rellenando una cadena en blanco)
- El número de caracteres a eliminar (1, siendo la coma inicial)
Entonces terminamos con:
aaa,bbb,ccc,ddd,eee
A continuación, simplemente unimos esto en la lista de ID en la tabla temporal, para obtener una lista de ID con nombre:
SELECT ID, abc = STUFF(
(SELECT ',' + name
FROM temp1 t1
WHERE t1.id = t2.id
FOR XML PATH (''))
, 1, 1, '') from temp1 t2
group by id;
Y tenemos nuestro resultado:
¡Espero que esto ayude!