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.
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
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
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;
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