2016-03-02 4 views
2

Я новичок в написании SQL-скриптов (по крайней мере, ничего больше, чем SELECT * FROM X). Я столкнулся с проблемой группировки таблицы по одному значению и последующим объединением значений из другого столбца в одну строку.MS SQL - группа по строке concat

Я хотел бы выполнить группу по временной таблице, а затем объединить значения столбца в группе вместе.

Таблица переменная таблицы (изменить), @categoriesToAdd, структура данных [SubscriberId int, CategoryId int].

То, что я пытаюсь сделать что-то вроде (я понимаю, что CONCAT это немного не хватает из MSSQL):

SELECT SubscriberId, 
     CONCAT(CONVERT(VARCHAR(10), CategoryId) + ', ') as categoriesAdded 
FROM @categoriesToAdd 
GROUP BY SubscriberId 

идентификаторов каскадных категорий для каждого абонента будут выглядеть примерно так: 0001, 0002, 0003, 0004

Спасибо!

+0

Вы искали 'GROUP_CONCAT (MySQL)/LISTAGG (Oracle)/string_agg (Postgresql)' эквивалент для MS SQL Server. Я предлагаю использовать 'STUFF + FOR XML'. Дополнительная информация и сравнение ** [Конкатенирование значений строк в Transact-SQL] (https://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/) * * – lad2025

ответ

2

В SQL Server вы можете использовать FOR XML PATH

select SubscriberId, 
categoriesAdded=Stuff((SELECT ',' + CAST(CategoryId as VARCHAR(255)) FROM catsToAdd t1 WHERE [email protected] 
FOR XML PATH ('')) 
      , 1, 1, '') 
from @categoriesToAdd as catsToAdd 
GROUP BY SubscriberId 
+0

@categoriesToAdd в выражении where «WHERE t1.SubscriberId = @ categoriesToAdd.SubscriberId» получает ошибку: «Должен объявить переменную масштабирования« @categoriesToAdd »« – Marek

+0

@Marek - это временная таблица или переменная таблицы? Поскольку переменные таблицы имеют область действия внутри оператора, они были определены. – Mihai

+0

я объявил его как объявляют @ categoriesToAdd таблицы \t (SubscriberId INT, CategoryId целое) Извините, если я задам вопрос так, что я могу изменить его! – Marek