Как преобразовать результат другой строки по аналогичному идентификатору в разные столбцы с уникальным идентификатором в запросе SQL Server
У меня есть две таблицы, которые имеют отношение "1:*". Я хочу объединить две таблицы и объединить все строки с одинаковым идентификатором в одну строку и разные столбцы с одинаковым значением строки.
Для моего результата в ssms 17 будет:
table1.id table2.tag
------------------------
1 <value a>
1 <value b>
1 <value c>
2 <value d>
2 <value e>
Я хочу такой результат:
table1.id C1.table2.tag C2.table2.tag C3.table2.tag
------------------------------------------------------------
1 <value a> <value b> <value c>
2 <value d> <value e> null
2 ответа
Если тегов не больше, вы можете выполнить условную агрегацию:
select id,
max(case when seq = 1 then tag end) as tag_1,
max(case when seq = 2 then tag end) as tag_2,
max(case when seq = 3 then tag end) as tag_3
from (select t1.id, t2.*, row_number() over (partition by t1.id order by t2.tag) as seq
from table1 t1 inner join
table2 t2
on t2.id = t1.id
) t
group by id;
Если в таблице больше тегов, вам понадобится Dynamic Pivot.
Я бы не рекомендовал помещать каждый тег в отдельный столбец. Альтернативой является объединение тегов в один столбец.
Например:
select t1.table1_id,
string_agg(t2.tag, ',') as tags
from table1 t1 join
table2 t2
on t2.id = t1.table2_id
group by t1.table1_id;
Тогда вам не нужно беспокоиться о максимальном количестве тегов для данного идентификатора или использовании динамического SQL.