有下面几个表期初表
物料    数量   期间
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

解决方案 »

  1.   

    --> 测试数据:#1
    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
    */
      

  2.   

    --> 测试数据: [期初表]
    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
      

  3.   

    create table #起初表(物料 char(1),数量 int, 期间 int)
    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 物料
      

  4.   


    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 物料