我现在有一张这样的一个表格,如下:
物料编码 上月未完成数量 本月计划数量 订单类型 车间
A001 100 0 CB A1
A002 20 100 CB A1
A001 50 0 MF A1
A002 245 34 MF A1
请问如何将上述表格用sql排列成一下表格形式: 物料编码 CB上月未完成数量 CB本月计划数量 MF上月未完成数量 MF本月计划数量 车间
A001 100 0 50 0 A1
A002 20 100 245 34 A1
物料编码 上月未完成数量 本月计划数量 订单类型 车间
A001 100 0 CB A1
A002 20 100 CB A1
A001 50 0 MF A1
A002 245 34 MF A1
请问如何将上述表格用sql排列成一下表格形式: 物料编码 CB上月未完成数量 CB本月计划数量 MF上月未完成数量 MF本月计划数量 车间
A001 100 0 50 0 A1
A002 20 100 245 34 A1
INSERT TESTTB
SELECT 'A001', 100 , 0 , 'CB', 'A1' UNION
SELECT 'A002', 20 , 100 , 'CB' , 'A1' UNION
SELECT 'A001', 50 , 0 , 'MF', 'A1' UNION
SELECT 'A002', 245 , 34 , 'MF', 'A1' SELECT * FROM TESTTB
SELECT 物料编码,
SUM(CB上月未完成数量)CB上月未完成数量,
SUM(CB本月计划数量)CB本月计划数量,
SUM(MF上月未完成数量)MF上月未完成数量,
SUM(MF本月计划数量)MF本月计划数量,
车间 FROM (SELECT 物料编码,
MAX(CASE WHEN 订单类型='CB' THEN 上月未完成数量 ELSE 0 END) AS CB上月未完成数量,
MAX(CASE WHEN 订单类型='CB' THEN 本月计划数量 ELSE 0 END) AS CB本月计划数量 ,
MAX(CASE WHEN 订单类型='MF' THEN 上月未完成数量 ELSE 0 END) AS MF上月未完成数量,
MAX(CASE WHEN 订单类型='MF' THEN 本月计划数量 ELSE 0 END) AS MF本月计划数量,车间
FROM TESTTB GROUP BY 物料编码,订单类型,上月未完成数量,本月计划数量,车间) AS T
GROUP BY 物料编码,车间
A001 100 0 50 0 A1
A002 20 100 245 34 A1
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([物料编码] varchar(4),[上月未完成数量] int,[本月计划数量] int,[订单类型] varchar(2),[车间] varchar(2))
insert [tb]
select 'A001',100,0,'CB','A1' union all
select 'A002',20,100,'CB','A1' union all
select 'A001',50,0,'MF','A1' union all
select 'A002',245,34,'MF','A1'
---查询---
select
[物料编码],
[CB上月未完成数量]=SUM(case [订单类型] when 'CB' then [上月未完成数量] else 0 end),
[CB本月计划数量]=SUM(case [订单类型] when 'CB' then [本月计划数量] else 0 end),
[MF上月未完成数量]=SUM(case [订单类型] when 'MF' then [上月未完成数量] else 0 end),
[MF本月计划数量]=SUM(case [订单类型] when 'MF' then [本月计划数量] else 0 end),
[车间]
from
tb
group by
[物料编码],
[车间]---结果---
物料编码 CB上月未完成数量 CB本月计划数量 MF上月未完成数量 MF本月计划数量 车间
---- ----------- ----------- ----------- ----------- ----
A001 100 0 50 0 A1
A002 20 100 245 34 A1(所影响的行数为 2 行)