Знакомы следующие вопросы
Решение опирается на возможности платформы работы с xml.
- Как вывести значения в строку через запятую?
- Как получить CSV (Comma Separated Values) из значений столбца?
CREATE TABLE [Data]( [objectId] [int] NOT NULL ,[value] varchar(10) NOT NULL ); GO insert into [Data] ([objectId], [value]) select 1, 'A' union all select 1, 'B' union all select 1, 'C' union all select 2, '11' union all select 2, '22' union all select 2, '33' union all select 3, 'Tom' union all select 3, 'and' union all select 3, 'Jerry'получить такой результат?
--objectId csv ------------- -------------- --1 A,B,C --2 11,22,33 --3 Tom,and,JerryПорой мне кажется, что это одна из самых простых и часто встречаемых задач, которая заставляет разработчик лезть в google. Под катом решение этой задачи.
Решение опирается на возможности платформы работы с xml.
select select [objectId], ( select [Data].[value] from [Data] where [Data].[objectId] = D.[objectId] for xml path('') ) [csv] from [Data] D group by [objectId] ---------------------------- --objectId csv ------------- -------------- --1 ABC --2 112233 --3 TomandJerryКак видно мы уже получили почти то что нам нужно, осталось только разделить результат запятыми. Для этого мы к [Data].[value] добавим запятую слева и воспользуемся функцией STUFF
select select [objectId], stuff(( select ','+[Data].[value] from [Data] where [Data].[objectId] = D.[objectId] for xml path('') ),1,1,'') [csv] from [Data] D group by [objectId] --objectId csv ------------- ------------- --1 A,B,C --2 11,22,33 --3 Tom,and,Jerry
Доп. возможности
Можно управлять порядком, в котором данные будут попадать в строкуselect [objectId], stuff(( select ','+[Data].[value] from [Data] where [Data].[objectId] = D.[objectId] order by [Data].[value] for xml path('') ),1,1,'') [csv] from [Data] D group by [objectId]Сортировать можно не только по полю, которое попадает в строку, но и по другим полям, не попадающим в результирующий набор.
Комментариев нет:
Отправить комментарий