Подтвердить что ты не робот

Результаты с запятыми в SQL

У меня есть следующий код, который создаст список с разделителями-запятыми для моих результатов:

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

Проблема заключается в том, что он создает одну массивную линию с разделителями-запятыми. Мне нужно, чтобы он возвращал список, разделенный запятыми, в строке.

Итак, если Simon входит в 2 учреждения, я ожидаю:

"INSTITUTION1, INSTITUTION2"

Поскольку я не предоставлял предложение where, я ожидаю, что мои результаты будут отображаться так, как это для каждой строки в базе данных.

4b9b3361

Ответ 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