SQL объединяет похожие строки и объединяет определенные столбцы

#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() значительно упростил бы все это (и был первым решением, которое дал мне мой поиск).