想要实现表1到表2的效果, 工序氧化有重复的行,请教!
表1:
单号 品名 工序号 工序名 生产量 报废量
MO1102 0002A 黑色 1 清洗 800 3
MO1102 0002A 黑色 2 喷砂 800 25
MO1102 0002A 黑色 3 氧化 800 1
MO1102 0002A 黑色 4 镭射 800 5
MO1102 0002A 黑色 5 氧化 800 0
MO1102 0002A 黑色 6 检查 800 10
表2:
单号 品名 清洗 喷砂 氧化 镭射 氧化 检查
MO1102 0002A 黑色 3 25 1 5 0 10
CREATE TABLE [mjob]
(
[ID] INT IDENTITY(1,1),
[P_Id] VARCHAR(50), --单号
[P_Name] VARCHAR(120), --品名
[Ps_Sn] Int, --工序号
[Ps_name] VARCHAR(120), --工序名
[Plan_Quan] int, --生产量
[Scrap_Quan] int, --报废量
CONSTRAINT [PK_mjob_ID] PRIMARY KEY(ID)
)
INSERT INTO mjob SELECT 'MO1102-0105', '0002A 黑色', 1,'清洗', 800, 3
INSERT INTO mjob SELECT 'MO1102-0105', '0002A 黑色', 2,'喷砂', 800, 25
INSERT INTO mjob SELECT 'MO1102-0105', '0002A 黑色', 3,'氧化', 800, 1
INSERT INTO mjob SELECT 'MO1102-0105', '0002A 黑色', 4,'镭射', 800, 5
INSERT INTO mjob SELECT 'MO1102-0105', '0002A 黑色', 5,'氧化', 800, 0
INSERT INTO mjob SELECT 'MO1102-0105', '0002A 黑色', 6,'检查', 800, 10
------解决思路----------------------
我原先第一反应就是这个,工序应该作为一行数据输出而不是做列头。
不过看你只给了一组数据,以为你每次只会查一组,所以给了动态的例子。
WITH /* 测试数据
mjob(P_Id,P_Name,Ps_Sn,Ps_name,Plan_Quan,Scrap_Quan) AS (
SELECT 'MO1102 0002A','黑色',1,'清洗', 800, 3 UNION ALL
SELECT 'MO1102 0002A','黑色',2,'喷砂', 800,25 UNION ALL
SELECT 'MO1102 0002A','黑色',3,'氧化', 800, 1 UNION ALL
SELECT 'MO1102 0002A','黑色',4,'镭射', 800, 5 UNION ALL
SELECT 'MO1102 0002A','黑色',5,'氧化', 800, 0 UNION ALL
SELECT 'MO1102 0002A','黑色',6,'检查', 800,10 UNION ALL
SELECT 'MO1101 0001B','黑色',1,'开料',1000,30 UNION ALL
SELECT 'MO1101 0001B','黑色',2,'拉丝',1000, 5 UNION ALL
SELECT 'MO1101 0001B','黑色',3,'NC' ,1000,10 UNION ALL
SELECT 'MO1101 0001B','黑色',4,'氧化',1000,15 UNION ALL
SELECT 'MO1101 0001B','黑色',5,'CNC' ,1000, 0 UNION ALL
SELECT 'MO1101 0001B','黑色',6,'检查',1000, 7
),*/
t1 AS (
SELECT *
FROM (
SELECT P_Id 单号,
P_Name 品名,
'工序名' tp,
Ps_Sn,
Ps_name
FROM mjob
) t
PIVOT (
MAX(Ps_name)
FOR [Ps_Sn] IN ([1],[2],[3],[4],[5],[6])
) p
)
,t2 AS (
SELECT *
FROM (
SELECT P_Id 单号,
P_Name 品名,
'报废量' tp,
Ps_Sn,
Convert(varchar(11),Scrap_Quan) Scrap_Quan
FROM mjob
) t
PIVOT (
MAX(Scrap_Quan)
FOR [Ps_Sn] IN ([1],[2],[3],[4],[5],[6])
) p
)
SELECT *
FROM (SELECT * FROM t1
UNION ALL
SELECT * FROM t2
) t
ORDER BY 单号, 品名, rn
单号 品名 tp 1 2 3 4 5 6
------------ ---- ------ ----------- ----------- ----------- ----------- ----------- -----------
MO1101 0001B 黑色 工序名 开料 拉丝 NC 氧化 CNC 检查
MO1101 0001B 黑色 报废量 30 5 10 15 0 7
MO1102 0002A 黑色 工序名 清洗 喷砂 氧化 镭射 氧化 检查
MO1102 0002A 黑色 报废量 3 25 1 5 0 10