34,576
社区成员
发帖
与我相关
我的任务
分享
--测试数据
if not object_id(N'Tempdb..#A') is null
drop table #A
Go
Create table #A([日期] Date,[产量] int,[工序] nvarchar(21))
Insert #A
select '2018-9-1',50,N'A' union all
select '2018-9-2',100,N'A' union all
select '2018-9-4',100,N'A'
GO
if not object_id(N'Tempdb..#B') is null
drop table #B
Go
Create table #B([日期] Date,[产量] int,[工序] nvarchar(21))
Insert #B
select '2018-9-1',80,N'B' union all
select '2018-9-3',100,N'B' union all
select '2018-9-4',50,N'B'
GO
if not object_id(N'Tempdb..#C') is null
drop table #C
Go
Create table #C([日期] Date,[产量] int,[工序] nvarchar(21))
Insert #C
select '2018-9-1',80,N'C' union all
select '2018-9-2',100,N'C' union all
select '2018-9-3',50,N'C' union all
select '2018-9-4',100,N'C'
GO
if not object_id(N'Tempdb..#D') is null
drop table #D
Go
Create table #D([日期] Date,[产量] int,[工序] nvarchar(21))
Insert #D
select '2018-9-1',80,N'D' union all
select '2018-9-2',100,N'D' union all
select '2018-9-3',50,N'D'
Go
--测试数据结束
SELECT COALESCE(a1.日期,b1.日期,c1.日期,d1.日期) 日期,a1.产量 A,b1.产量 B,c1.产量 C,d1.产量 D FROM
(
Select *,ROW_NUMBER()OVER(ORDER BY 日期) rn from #A)a1
FULL JOIN(
Select *,ROW_NUMBER()OVER(ORDER BY 日期) rn from #B)b1 ON b1.rn = a1.rn
FULL JOIN(
Select *,ROW_NUMBER()OVER(ORDER BY 日期) rn from #C)c1 ON c1.rn = a1.rn
FULL JOIN(
Select *,ROW_NUMBER()OVER(ORDER BY 日期) rn from #D)d1 ON d1.rn = a1.rn
WITH T AS
(
SELECT 日期 FROM A UNION
SELECT 日期 FROM B UNION
SELECT 日期 FROM C UNION
SELECT 日期 FROM D
)
SELECT
T.日期,
A.产量 A,
B.产量 B,
C.产量 C,
D.产量 D
FROM
T
LEFT JOIN A ON T.日期 = A.日期
LEFT JOIN B ON T.日期 = B.日期
LEFT JOIN C ON T.日期 = C.日期
LEFT JOIN D ON T.日期 = D.日期
ORDER BY
T.日期
/*
日期 A B C D
------------ ------ ------ ----- ------
2018-09-01 50 80 80 80
2018-09-02 100 NULL 100 100
2018-09-03 NULL 100 50 50
2018-09-04 100 50 100 NULL
(4 rows affected)
*/
WITH T AS
(
SELECT * FROM A UNION ALL
SELECT * FROM B UNION ALL
SELECT * FROM C UNION ALL
SELECT * FROM D
)
SELECT
日期,
SUM(CASE WHEN 工序 = 'A' THEN 产量 END) A,
SUM(CASE WHEN 工序 = 'B' THEN 产量 END) B,
SUM(CASE WHEN 工序 = 'C' THEN 产量 END) C,
SUM(CASE WHEN 工序 = 'D' THEN 产量 END) D
FROM
T
GROUP BY
日期
/*
日期 A B C D
------------ ------ ------ ----- ------
2018-09-01 50 80 80 80
2018-09-02 100 NULL 100 100
2018-09-03 NULL 100 50 50
2018-09-04 100 50 100 NULL
(4 rows affected)
*/