Создание столбцов из данных одного столбца на сервере SQL - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть SQL Таблица сервера, подобная этой

ID    amount        type
1         10        material
1          5        spare parts
1          5        material

Мне нужно сделать запрос и получить выходные данные, подобные этому

ID        material        spare parts
1            15                     5


Но у меня слишком много IDS и типов, поэтому мне нужно динамически добавлять элементы независимо от их количества.

1 Ответ

3 голосов
/ 01 апреля 2020

Вы ищете динамический 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

...