Вот пример реализации динамического c условного агрегирования:
--create test table
create table #values (
[ID] int
,[Value] char(1))
--populate test table
insert into #values
values
(1, 'a')
,(1, 'b')
,(2, 'a')
,(2, 'c')
,(3, 'a')
,(3, 'd')
--declare variable that will hold dynamic query
declare @query nvarchar(max) = ' select [ID] '
--build dynamic query and assign it to variable
select
@query = @query + max(',max(case when [value] = '''
+ [value] + ''' then 1 else 0 end) as Value_' + [value] )
from
#values
group by
[value]
--add group by clause to dunamic query
set @query = @query + ' from #values group by [id]'
--execute dynamic query
exec (@query)
это результат:
Теперь вы можете добавить значение (например, id = 4 и value = 'e'), заменив исходную вставку на эту:
insert into #values
values
(1, 'a')
,(1, 'b')
,(2, 'a')
,(2, 'c')
,(3, 'a')
,(3, 'd')
,(4, 'a')
,(4, 'e')
это новый вывод: