从 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
我有一个 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