Resultados separados por comas en SQL


Tengo el siguiente código que creará una lista delimitada por comas para mis resultados:

DECLARE @listStr VARCHAR(MAX)
SELECT @listStr = COALESCE(@listStr+', ' ,'') + INSTITUTIONNAME
FROM EDUCATION
WHERE STUDENTNUMBER= '111'
SELECT @listStr

El problema es su creación de una línea delimitada por comas masivas. Lo necesito para devolver una lista separada por comas por fila.

Así que si Simon ha sido parte de 2 instituciones, entonces espero:

"INSTITUTION1, INSTITUTION2"

Como no proporcioné una cláusula where espero que mis resultados se muestren así para cada fila en la base de datos.

Author: a_horse_with_no_name, 2013-09-18

3 answers

Use FOR XML PATH('') y STUFF () de la siguiente manera Que le da el mismo resultado separado por comas

SELECT  STUFF((SELECT  ',' + INSTITUTIONNAME
            FROM EDUCATION EE
            WHERE  EE.STUDENTNUMBER=E.STUDENTNUMBER
            ORDER BY sortOrder
        FOR XML PATH('')), 1, 1, '') AS listStr

FROM EDUCATION E
GROUP BY E.STUDENTNUMBER

Aquí está el VIOLÍN

 57
Author: Nithesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-23 09:03:21
DECLARE @listStr VARCHAR(MAX)
SELECT @listStr = COALESCE(@listStr+', ' ,'') + INSTITUTIONNAME
FROM EDUCATION
WHERE STUDENTNUMBER= '111'
SELECT @listStr
 10
Author: Joseph N Shinene,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-14 11:19:09

Para Sql Server 2017 y posteriores puede utilizar la nueva función STRING_AGG

Https://docs.microsoft.com/en-us/sql/t-sql/functions/string-agg-transact-sql

El siguiente ejemplo reemplaza los valores nulos con 'N / A' y devuelve nombres separados por comas en una sola celda de resultados.

SELECT STRING_AGG ( ISNULL(FirstName,'N/A'), ',') AS csv 
FROM Person.Person;

Aquí está el conjunto de resultados.

John,N/A,Mike,Peter,N/A,N/A,Alice,Bob

Tal vez un caso de uso más común es agrupar y luego agregar, al igual que lo haría con SUM, COUNT o AVG.

SELECT a.articleId, title, STRING_AGG (tag, ',') as tags 
FROM dbo.Article AS a       
LEFT JOIN dbo.ArticleTag AS t 
    ON a.ArticleId = t.ArticleId 
GROUP BY a.articleId, title;
 6
Author: Simon_Weaver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-14 20:45:59