有下面几个表期初表
物料 数量 期间
A 100 6
B 200 5
入库表
物料 数量 期间
C 100 5
D 200 5
出库数量
物料 数量 期间
D 100 5
E 200 5要求第五期间的下面结果物料 期初 入库 出库
B 200 0 0
C 0 100 0
D 0 200 100
E 0 0 100
物料 数量 期间
A 100 6
B 200 5
入库表
物料 数量 期间
C 100 5
D 200 5
出库数量
物料 数量 期间
D 100 5
E 200 5要求第五期间的下面结果物料 期初 入库 出库
B 200 0 0
C 0 100 0
D 0 200 100
E 0 0 100
if object_id('tempdb.dbo.#1') is not null drop table #1
create table #1(物料 varchar(8), 数量 int, 期间 int)
insert into #1
select 'A', 100, 6 union all
select 'B', 200, 5
--> 测试数据:#2
if object_id('tempdb.dbo.#2') is not null drop table #2
create table #2(物料 varchar(8), 数量 int, 期间 int)
insert into #2
select 'C', 100, 5 union all
select 'D', 200, 5
--> 测试数据:#3
if object_id('tempdb.dbo.#3') is not null drop table #3
create table #3(物料 varchar(8), 数量 int, 期间 int)
insert into #3
select 'D', 100, 5 union all
select 'E', 200, 5select 物料,
期初=sum(case type when '期初' then 数量 else 0 end),
入库=sum(case type when '入库' then 数量 else 0 end),
出库=sum(case type when '出库' then 数量 else 0 end)
from
(
select *, '期初'type from #1 where 期间=5
union all
select *, '入库' from #2 where 期间=5
union all
select *, '出库' from #3 where 期间=5
) t
group by 物料/*
物料 期初 入库 出库
-------- ----------- ----------- -----------
B 200 0 0
C 0 100 0
D 0 200 100
E 0 0 200
*/
if object_id('[期初表]') is not null drop table [期初表]
create table [期初表] (物料 varchar(1),数量 int,期间 int)
insert into [期初表]
select 'A',100,6 union all
select 'B',200,5
--> 测试数据: [入库表]
if object_id('[入库表]') is not null drop table [入库表]
create table [入库表] (物料 varchar(1),数量 int,期间 int)
insert into [入库表]
select 'C',100,5 union all
select 'D',200,5
--> 测试数据: [出库数量]
if object_id('[出库数量]') is not null drop table [出库数量]
create table [出库数量] (物料 varchar(1),数量 int,期间 int)
insert into [出库数量]
select 'D',100,5 union all
select 'E',200,5
select 物料=coalesce(a.物料,b.物料,c.物料),期初=isnull(a.数量,0),入库=isnull(b.数量,0),出库=isnull(c.数量,0) from 期初表 a full join 入库表 b
on a.物料=b.物料
full join 出库数量 c on a.物料=c.物料 or b.物料=c.物料
where a.期间=5 or b.期间=5 or c.期间=5--结果:
物料 期初 入库 出库
B 200 0 0
C 0 100 0
D 0 200 100
E 0 0 100
insert into #起初表
select 'A',100, 6 union all
select 'B', 200, 5create table #入库表(物料 char(1),数量 int, 期间 int)
insert into #入库表
select 'C',100, 5 union all
select 'D', 200, 5 create table #出库数量(物料 char(1),数量 int, 期间 int)
insert into #出库数量
select 'D',100, 5 union all
select 'E', 200, 5 ;
with cte as
(
SELECT 物料,数量,0 入库,0 出库 FROM #起初表 WHERE 期间=5
union allSELECT 物料,0,数量,0 FROM #入库表 WHERE 期间=5
union allSELECT 物料,0,0,数量 FROM #出库数量 WHERE 期间=5)select 物料,sum(入库)入库,sum(出库)出库 from cte group by 物料
SQL2000:select 物料,sum(入库)入库,sum(出库)出库(
SELECT 物料,数量,0 入库,0 出库 FROM #起初表 WHERE 期间=5
union all
SELECT 物料,0,数量,0 FROM #入库表 WHERE 期间=5
union all
SELECT 物料,0,0,数量 FROM #出库数量 WHERE 期间=5) AS T
group by 物料