实际上一个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.原料出库时间
查出每笔出库结存
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.原料出库时间
查出每笔出库结存
表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
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'
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.原料出库时间--真他妈烦
--写个统计的存储过程
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'
select 原料编号,原料名称,上月结存,
(select sum(入库数量) from 原料入库表 where datename(month,原料入库时间)='几月份' group by 原料编号 ) 本月入库,
(select sum(出库数量) from 原料出库表 where datename(month,原料出库时间)='几月份' group by 原料编号 ) 本月出库,(本月入库+a.上月结存-本月出库) as 本月结存
from 基本表 a没测试!
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.原料编号
(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
我根据你写的代码写了如下存储过程:
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语句中,不知是为什么?
AS
set nocount on
declare @dt1 datetime,@dt2 datetime
select @dt1=@Yearmonth +'02',@dt2=dateadd(month,1,@dt1)-1
select @dt1,@dt2 --看是否这里的转换有问题
....