#sql #tsql
#sql #tsql
Вопрос:
У меня есть таблица, которая выглядит как:
ID-----Name-----Version
1 | TestX | 1.2
2 | TestX | 1.2
3 | TestX | 1.2
4 | TestX | 1.3
5 | TestX | 1.3
Мне нужно запросить его на основе имени и версии, и результаты будут выглядеть следующим образом:
ID-----Name-----Version
1,2,3 | TestX | 1.2
4,5 | TestX | 1.3
Я не могу понять, как заставить concat работать так, как я хочу.
Комментарии:
1. Найдите sql server group_concat
2. @HoneyBadger group_concat — потрясающе, каждый день узнай что-то новое! Я думаю, это то, что я ищу. Спасибо!
Ответ №1:
Вы можете использовать FOR XML PATH()
:
SELECT DISTINCT STUFF(tt.id, 1, 1, '') AS ID, t.Name, t.Version
FROM table t CROSS APPLY
(SELECT ', ' t1.id
FROM table t1
WHERE t1.Name = t.Name AND t1.version = t.Version
FOR XML PATH('')
) tt(id);
Если вы работаете с последней версией SQL Server
, то вы можете использовать STRING_AGG() :
SELECT STRING_AGG(ID, ', ') as ID, Name, Version
FROM table t
GROUP BU Name, Version;
Комментарии:
1. Я попробую ваше первое решение и сообщу об этом. Жаль, что я не использую последнюю версию — string_agg() значительно упростил бы все это (и был первым решением, которое дал мне мой поиск).