从 SQL 服务器中的一列数据创建列

Making columns from one column's data in SQL Server

我有一个 SQL 服务器 table 像这样

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

我需要进行查询并获得这样的输出

ID        material        spare parts
1            15                     5


但是我的 IDS 和类型太多,所以我需要动态添加项目,无论它们的数量是多少。

您正在寻找动态枢轴。基本上这可以从 table 中选择 type 的列表,然后根据该信息构建查询。然后,您可以使用 sp_executesql.

执行查询

对于您的 table 结构:

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

Demo on DB Fiddle