Вы ищете динамический c пивот. В основном это работает, выбирая список type
s из таблицы, а затем формируя запрос на основе этой информации. Затем вы можете выполнить запрос с помощью sp_executesql
.
Для вашей структуры таблицы:
declare @sql nvarchar(max);
select @sql = string_agg(
'sum(case when type = ''' + type + ''' then amount else 0 end) [' + type + ']',
', ')
from (select distinct type from mytable) t;
set @sql = N'select id, ' + @sql + ' from mytable group by id';
select @sql; -- debug
-- exec sp_executesql @sql; -- execute for real
Для ваших примеров данных будет сгенерирован следующий запрос (я добавил разрывы строк, добавленные для удобства чтения) :
select
id,
sum(case when type = 'material' then amount else 0 end) [material],
sum(case when type = 'spare parts' then amount else 0 end) [spare parts]
from mytable
group by id
После выполнения вы получите результат:
id | material | spare parts
-: | -------: | ----------:
1 | 15 | 5
Демонстрация на DB Fiddle