Результаты с запятыми в SQL
У меня есть следующий код, который создаст список с разделителями-запятыми для моих результатов:
DECLARE @listStr VARCHAR(MAX)
SELECT @listStr = COALESCE(@listStr+', ' ,'') + INSTITUTIONNAME
FROM EDUCATION
WHERE STUDENTNUMBER= '111'
SELECT @listStr
Проблема заключается в том, что он создает одну массивную линию с разделителями-запятыми. Мне нужно, чтобы он возвращал список, разделенный запятыми, в строке.
Итак, если Simon
входит в 2 учреждения, я ожидаю:
"INSTITUTION1, INSTITUTION2"
Поскольку я не предоставлял предложение where, я ожидаю, что мои результаты будут отображаться так, как это для каждой строки в базе данных.
Ответы
Ответ 1
Используйте FOR XML PATH('')
и STUFF() следующим образом, который дает вам одинаковый результат с запятой
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
Вот FIDDLE
Ответ 2
Для Sql Server 2017 и более поздних STRING_AGG
вы можете использовать новую функцию STRING_AGG
https://docs.microsoft.com/en-us/sql/t-sql/functions/string-agg-transact-sql
В следующем примере нулевые значения заменяются на "N/A" и возвращаются имена, разделенные запятыми в одной ячейке результата.
SELECT STRING_AGG ( ISNULL(FirstName,'N/A'), ',') AS csv
FROM Person.Person;
Вот набор результатов.
John,N/A,Mike,Peter,N/A,N/A,Alice,Bob
Возможно, более распространенным вариантом использования является группирование, а затем агрегирование, как вы бы SUM
с SUM
, COUNT
или 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;
Ответ 3
DECLARE @listStr VARCHAR(MAX)
SELECT @listStr = COALESCE(@listStr+', ' ,'') + INSTITUTIONNAME
FROM EDUCATION
WHERE STUDENTNUMBER= '111'
SELECT @listStr
Ответ 4
Я только что увидел другой вопрос, очень похожий на этот!
Вот канонический пример базы данных NORTHWIND (пишется немного иначе).
SELECT *
FROM [NORTHWND].[dbo].[Products]
![enter image description here]()
SELECT CategoryId,
MAX( CASE seq WHEN 1 THEN ProductName ELSE '' END ) + ', ' +
MAX( CASE seq WHEN 2 THEN ProductName ELSE '' END ) + ', ' +
MAX( CASE seq WHEN 3 THEN ProductName ELSE '' END ) + ', ' +
MAX( CASE seq WHEN 4 THEN ProductName ELSE '' END )
FROM ( SELECT p1.CategoryId, p1.ProductName,
( SELECT COUNT(*)
FROM NORTHWND.dbo.Products p2
WHERE p2.CategoryId = p1.CategoryId
AND p2.ProductName <= p1.ProductName )
FROM NORTHWND.dbo.Products p1 ) D ( CategoryId, ProductName, seq )
GROUP BY CategoryId ;
![enter image description here]()