2013-09-18 6 views
20

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

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

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

Так что, если Simon была частью 2 учреждений, то я ожидаю:

"INSTITUTION1, INSTITUTION2" 

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

+0

Если 'Simon' является частью 2 учреждений, то где хранится эта информация? Из того, что я вижу, у вас есть только поле 'INSTITUIONNAME'. – James

+0

Возможный дубликат [Объединить много строк в одну текстовую строку?] (Https://stackoverflow.com/questions/194852/concatenate-many-rows-into-a-single-text-string) – Liam

ответ

51

Использование 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

Я не могу использовать синтаксис 2012 года ! – PriceCheaperton

+0

Это не синтаксис 2012 года. попробуйте – Nithesh

+4

Just FYI- его 'FOR XML PATH ('')' трюк, который дает вам групповой агрегированный столбец, а не STUFF, который в этом случае является просто альтернативой COALESCE, чтобы присоединиться к строке до последней. другой пример: http://stackoverflow.com/questions/5452681/sql-aggregating-strings-together –

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

Для Sql Server 2017, а затем вы можете использовать новую 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 
Смежные вопросы