实际上一个join 
select  a.原料出库时间 ,sum(b.入库数量)-sum(c.出库数量) as 结存
from 
原料出库表 a 
join  原料入库表 b 
        on a.原料编号=b.原料编号 and a.原料出库时间>=b.原料入库时间 
join      原料出库表 c 
        on  a.原料编号=c.原料编号 and a.原料出库时间>=c.原料出库时间
group  by a.原料编号,a.原料出库时间
查出每笔出库结存

解决方案 »

  1.   

    在数据库现有两张表
       表a:原料入库表
       字段有:原料编号,原料名称,原料入库时间,入库数量   表b:原料出库表   
       字段有:原料编号,原料名称,原料出库时间,出库数量   要生成如下统计月报表 :
     字段有:原料编号,原料名称,上月结存,本月入库,本月出库,本月结存
           本月结存=上月结存+本月入库-本月出库
    如何实现啊?--写个统计的存储过程
    create proc p_total
    @年月 varchar(6) --要统计的年月
    as
    set nocount on
    declare @dt1 datetime,@dt2 datetime
    select @dt1=@年月+'01',@dt2=dateadd(month,1,@dt1)-1select 年月=@年月
    ,原料编号=isnull(a.原料编号,b.原料编号)
    ,原料名称=isnull(a.原料名称,b.原料名称)
    ,上月结存=isnull(期初入库,0)-isnull(期初出库,0)
    ,本月入库=isnull(本月入库,0),本月出库=isnull(本月出库,0)
    ,本月结存=isnull(期初入库,0)-isnull(期初出库,0)
    +isnull(本月入库,0)-isnull(本月出库,0)
    from(
    select 原料编号,原料名称,本月入库=sum(入库数量)
    ,期初入库=(select sum(入库数量) from 原料入库表
    where 原料入库时间<@dt1)
    from 原料入库表
    where 原料入库时间 between @dt1 and @dt2
    group by 原料编号,原料名称
    )a full join(
    select 原料编号,原料名称,本月出库=sum(出库数量)
    ,期初出库=(select sum(出库数量) from 原料出库表
    where 原料出库时间<@dt1)
    from 原料出库表
    where 原料出库时间 between @dt1 and @dt2
    group by 原料编号,原料名称
    )b on a.原料编号=b.原料编号
    set nocount off
    go
      

  2.   

    --写个统计的存储过程
    create proc p_total
    @年月 varchar(6) --要统计的年月
    as
    set nocount on
    declare @dt1 datetime,@dt2 datetime
    select @dt1=@年月+'01',@dt2=dateadd(month,1,@dt1)-1select 年月=@年月
    ,原料编号=isnull(a.原料编号,b.原料编号)
    ,原料名称=isnull(a.原料名称,b.原料名称)
    ,上月结存=isnull(期初入库,0)-isnull(期初出库,0)
    ,本月入库=isnull(本月入库,0),本月出库=isnull(本月出库,0)
    ,本月结存=isnull(期初入库,0)-isnull(期初出库,0)
    +isnull(本月入库,0)-isnull(本月出库,0)
    from(
    select 原料编号,原料名称,本月入库=sum(入库数量)
    ,期初入库=(select sum(入库数量) from 原料入库表
    where 原料入库时间<@dt1)
    from 原料入库表
    where 原料入库时间 between @dt1 and @dt2
    group by 原料编号,原料名称
    )a full join(
    select 原料编号,原料名称,本月出库=sum(出库数量)
    ,期初出库=(select sum(出库数量) from 原料出库表
    where 原料出库时间<@dt1)
    from 原料出库表
    where 原料出库时间 between @dt1 and @dt2
    group by 原料编号,原料名称
    )b on a.原料编号=b.原料编号
    set nocount off
    go--调用示例
    exec p_total '200301'
      

  3.   

    那的问题,多join 几次或 用个case 和where 可以搞定select  a.原料出库时间 ,
    sum(case when datediff(month,b.原料入库时间,getdate())>=1 then  b.入库数量 else 0 end )-sum(case when datediff(month,c.原料出库时间,getdate())>=1 then  c.出库数量 else  0 end) as 上月结存,
    sum(case when datediff(month,b.原料入库时间,getdate()) =0 then  b.入库数量 else 0 end ) 本月到目前入库,
    sum(case when datediff(month,c.原料出库时间,getdate()) =0 then  c.出库数量 else  0 end) as 本月到目前出库,
    sum(b.入库数量)-sum(c.出库数量) as 本笔结存
    from 
    原料出库表 a 
    join  原料入库表 b 
            on a.原料编号=b.原料编号 and a.原料出库时间>=b.原料入库时间 
    join      原料出库表 c 
            on  a.原料编号=c.原料编号 and a.原料出库时间>=c.原料出库时间
    where datediff(month,getdate(),原料出库时间)=0 
    group  by a.原料编号,a.原料出库时间--真他妈烦
      

  4.   

    --改一下,考虑可能出现,本月无发生,或只有本月发生,或只有出库/放库之一等情况
    --写个统计的存储过程
    create proc p_total
    @年月 varchar(6) --要统计的年月
    as
    set nocount on
    declare @dt1 datetime,@dt2 datetime
    select @dt1=@年月+'01',@dt2=dateadd(month,1,@dt1)-1select 年月=@年月
    ,原料编号=isnull(a.原料编号,b.原料编号)
    ,原料名称=isnull(a.原料名称,b.原料名称)
    ,上月结存=isnull(期初入库,0)-isnull(期初出库,0)
    ,本月入库=isnull(本月入库,0),本月出库=isnull(本月出库,0)
    ,本月结存=isnull(期初入库,0)-isnull(期初出库,0)
    +isnull(本月入库,0)-isnull(本月出库,0)
    from(
    select  原料编号=isnull(a.原料编号,b.原料编号)
    ,原料名称=isnull(a.原料名称,b.原料名称)
    ,本月入库,期初入库
    from(
    select 原料编号,原料名称,本月入库
    from 原料入库表
    where 原料入库时间 between @dt1 and @dt2
    group by 原料编号,原料名称
    )a full join(
    select 原料编号,原料名称,期初入库=sum(入库数量)
    from 原料入库表
    where 原料入库时间<@dt1
    group by 原料编号,原料名称
    )b on a.原料编号=b.原料编号
    )a full join(
    select  原料编号=isnull(a.原料编号,b.原料编号)
    ,原料名称=isnull(a.原料名称,b.原料名称)
    ,本月出库,期初出库
    from(
    select 原料编号,原料名称,本月出库
    from 原料出库表
    where 原料出库时间 between @dt1 and @dt2
    group by 原料编号,原料名称
    )a full join(
    select 原料编号,原料名称,期初出库=sum(出库数量)
    from 原料出库表
    where 原料出库时间<@dt1
    group by 原料编号,原料名称
    )b on a.原料编号=b.原料编号
    )b on a.原料编号=b.原料编号
    set nocount off
    go
    --调用示例
    exec p_total '200301'
      

  5.   

    想了下,还是应该有另外的一张基本表把:原料编号,原料名称,上月结存
    select 原料编号,原料名称,上月结存,
    (select sum(入库数量) from 原料入库表 where datename(month,原料入库时间)='几月份' group by 原料编号 ) 本月入库,
    (select sum(出库数量) from 原料出库表 where datename(month,原料出库时间)='几月份' group by 原料编号 ) 本月出库,(本月入库+a.上月结存-本月出库) as 本月结存
    from  基本表 a没测试!
      

  6.   

    想了下,还是应该有另外的一张基本表把:原料编号,原料名称,上月结存
    select 原料编号,原料名称,上月结存,
    (select sum(入库数量) from 原料入库表 where datename(month,原料入库时间)='几月份' group by 原料编号 ) 本月入库,
    (select sum(出库数量) from 原料出库表 where datename(month,原料出库时间)='几月份' group by 原料编号 ) 本月出库,(本月入库+a.上月结存-本月出库) as 本月结存
    from  基本表 a 
    join 原料入库表 b on a.原料编号=b.原料编号
    join 原料入库表 c on a.原料编号=c.原料编号
      

  7.   

    入库表:Create table tbRKB
    (vcBH varchar(10),  --原料编号
     vcMC varchar(20),  --原料名称
     dtRKRQ datetime,   --入库日期
     fRKSL float)       --入库数量
    出库表:create table tbCKB
    (vcBH varchar(10),  --原料编号
     vcMC varchar(20),  --原料名称
     dtCKRQ datetime,   --出库日期
     fCKSL float)       --出库数量
    以日期'2004-03-01 00:00:00'为例进行说明,即统计2月份的select b.vcBH,b.vcMC,[zRKSL]=isnull(b.zRKSL,0),    [zCKSL]=isnull(c.zCKSL,0),
                         [本月入库]=isnull(f.zRKSL_BY,0),
                         [本月出库]=isnull(h.zCKSL_BY,0),             [zRKSL_SY]=isnull(j.zRKSL_SY,0),
                         [zCKSL_SY]=isnull(m.zCKSL_SY,0),
                         [本月结存]=isnull(isnull(zRKSL,0)-isnull(zCKSL,0),0),
                         [上月结存]=isnull(isnull(zRKSL_SY,0)-isnull(zCKSL_SY,0),0)
                         
    from (select a.vcbh,a.vcmc,sum(isnull(a.fRKSL,0)) as zRKSL from tbRKB a where a.dtRKRQ<'2004-03-01 00:00:00'  group by a.vcBH,a.vcmc) b 
    left outer join 
    (select d.vcbh,d.vcmc,sum(isnull(d.fCKSL,0)) as zCKSL from tbCKB d where d.dtCKRQ<'2004-03-01 00:00:00'  group by d.vcBH,d.vcmc) c
    on b.vcBH=c.vcBH
      left outer join 
      (select e.vcbh,e.vcmc,sum(isnull(e.fRKSL,0)) as zRKSL_BY from tbRKB e where datepart(mm,e.dtRKRQ)=datepart(mm,cast('2004-03-01 00:00:00' as datetime))-1  group by e.vcBH,e.vcmc) f 
      on b.vcBH=f.vcBH
    left outer join 
      (select g.vcbh,g.vcmc,sum(isnull(g.fCKSL,0)) as zCKSL_BY from tbCKB g where datepart(mm,g.dtCKRQ)=datepart(mm,cast('2004-03-01 00:00:00' as datetime))-1  group by g.vcBH,g.vcmc) h 
      on b.vcBH=h.vcBH
      left outer join 
      (select i.vcbh,i.vcmc,sum(isnull(i.fRKSL,0)) as zRKSL_SY from tbRKB i where i.dtRKRQ<dateadd(mm,-1,'2004-03-01 00:00:00')  group by i.vcBH,i.vcmc) j 
      on b.vcBH=j.vcBH
      left outer join 
      (select k.vcbh,k.vcmc,sum(isnull(k.fCKSL,0)) as zCKSL_SY from tbCKB k where k.dtCKRQ<dateadd(mm,-1,'2004-03-01 00:00:00')  group by k.vcBH,k.vcmc) m 
      on b.vcBH=m.vcBH
    order by b.vcBH
      

  8.   

    to:zjcxc(: 邹建 :) 
    我根据你写的代码写了如下存储过程:
    CREATE PROCEDURE  p_total   @Yearmonth  Varchar(8)
    AS 
     set nocount on 
             declare @dt1 datetime,@dt2 datetime
            select @dt1=@Yearmonth +'02',@dt2=dateadd(month,1,@dt1)-1
      select Date =@Yearmonth 
    ,code=isnull(V_yuanliaoruku.code,V_yuanliaochuku.code)
    ,name=isnull(V_yuanliaoruku.name,V_yuanliaochuku.name)
            ,Spec=isnull(V_yuanliaoruku.Spec,V_yuanliaochuku.Spec)
            ,Unit=isnull(V_yuanliaoruku.Unit,V_yuanliaochuku.Unit)
    ,上月结存=isnull(期初入库,0)-isnull(期初出库,0)
    ,本月入库=isnull(Amount,0),本月出库=isnull(Fact_amount,0)
    ,本月结存=isnull(期初入库,0)-isnull(期初出库,0)
    +isnull(Amount,0)-isnull(Fact_amount,0)
    from(
    select  code=isnull(V_yuanliaoruku.code,V_yuanliaochuku.code)
    ,name=isnull(V_yuanliaoruku.name,V_yuanliaochuku.name)
                    ,Spec=isnull(V_yuanliaoruku.Spec,V_yuanliaochuku.Spec)
                    ,Unit=isnull(V_yuanliaoruku.Unit,V_yuanliaochuku.Unit)
    ,Amount,期初入库
    from(
    select code,name,Spec,unit,Amount
    from V_yuanliaoruku
    where Date between @dt1 and @dt2
    group by code,name,Spec,unit,Amount
    )V_yuanliaoruku full join(
    select code,name,Spec,unit,期初入库=sum(Amount)
    from V_yuanliaoruku
    where date<@dt1
    group by code,name,Spec,unit
    )V_yuanliaochuku on V_yuanliaoruku.code=V_yuanliaochuku.code
    )V_yuanliaoruku full join(
    select  code=isnull(V_yuanliaoruku.code,V_yuanliaochuku.code)
    ,name=isnull(V_yuanliaoruku.name,V_yuanliaochuku.name)
                    ,Spec=isnull(V_yuanliaoruku.Spec,V_yuanliaochuku.Spec)
                     ,Unit=isnull(V_yuanliaoruku.Unit,V_yuanliaochuku.Unit)
    ,Fact_amount,期初出库
    from(
    select code,name,Spec,unit,Fact_amount
    from V_yuanliaochuku
    where date between @dt1 and @dt2
    group by code,name,Spec,unit,Fact_amount
    )V_yuanliaoruku full join(
    select code,name,Spec,unit,期初出库=sum(Fact_amount)
    from V_yuanliaochuku
    where date<@dt1
    group by code,name,Spec,unit
    )V_yuanliaochuku on V_yuanliaoruku.code=V_yuanliaochuku.code
    )V_yuanliaochuku on V_yuanliaoruku.code=V_yuanliaochuku.code
    set nocount off
    GO
    当执行exec p_total 200403 后没有记录。但我把select语句中的年月参数换成具体的年月比如
    :200403时,记录就能正常出现。问题好象是时间参数没有传到内部的select语句中,不知是为什么?
      

  9.   

    --有这么奇,给数据出来测试一下,另外,你调试一下CREATE PROCEDURE  p_total   @Yearmonth  Varchar(8)
    AS 
     set nocount on 
             declare @dt1 datetime,@dt2 datetime
            select @dt1=@Yearmonth +'02',@dt2=dateadd(month,1,@dt1)-1
    select @dt1,@dt2 --看是否这里的转换有问题
    ....