--新建表@t,求写成一个存储过程,传递一个截至日期的参数,比如2009-3-1怎么实现这种格式的账龄表,要按物资类别分类,因为同一种物资财务有时候要按耗材,有时按材料入账。
--物资类别 物料编码 账龄(天) 数量 总金额
--测试数据,我插入的数据记录比较多,大家也可以自定义些数据,不要那么多。
declare @t table(
物料编码 varchar(20),
出入库类别 varchar(20) ,
出入库日期 datetime,
物资类别 varchar(20),
数量 float,
单价 money,
总金额 money
)
insert @t
select 'A004' ,'出库' ,'2008-8-5' ,'耗材' ,-40 ,5 ,-200
union select 'A004' ,'出库' ,'2008-8-5' ,'耗材' ,-100 ,5 ,-500
union select 'A004' ,'出库' ,'2008-9-25' ,'耗材' ,-5 ,5 ,-25
union select 'A004' ,'出库' ,'2008-9-25' ,'耗材' ,-7 ,5 ,-35
union select 'A004' ,'出库' ,'2008-10-24' ,'耗材' ,-10 ,5 ,-50
union select 'A004' ,'出库' ,'2009-1-15' ,'耗材' ,-5 ,5 ,-25
union select 'A004' ,'出库' ,'2009-2-11' ,'耗材' ,-4 ,5 ,-20
union select 'A004' ,'出库' ,'2009-4-15' ,'耗材' ,-10 ,5 ,-50
union select 'A004' ,'入库' ,'2008-6-5' ,'耗材' ,962 ,5 ,4810
union select 'A004' ,'入库' ,'2009-1-19' ,'原材料' ,100 ,9.4017 ,940.17
union select 'A004' ,'入库' ,'2009-3-31' ,'耗材' ,5 ,5 ,25union select 'A045' ,'出库' ,'2008-7-15' ,'原材料' ,-1 ,10 ,-10
union select 'A045' ,'出库' ,'2008-10-14' ,'原材料' ,-1 ,10 ,-10
union select 'A045' ,'出库' ,'2008-11-5' ,'原材料' ,-4 ,10 ,-40
union select 'A045' ,'出库' ,'2009-2-9' ,'原材料' ,-1 ,10 ,-10
union select 'A045' ,'入库' ,'2008-6-5' ,'原材料' ,8 ,10 ,80select * from @t
--物资类别 物料编码 账龄(天) 数量 总金额
--测试数据,我插入的数据记录比较多,大家也可以自定义些数据,不要那么多。
declare @t table(
物料编码 varchar(20),
出入库类别 varchar(20) ,
出入库日期 datetime,
物资类别 varchar(20),
数量 float,
单价 money,
总金额 money
)
insert @t
select 'A004' ,'出库' ,'2008-8-5' ,'耗材' ,-40 ,5 ,-200
union select 'A004' ,'出库' ,'2008-8-5' ,'耗材' ,-100 ,5 ,-500
union select 'A004' ,'出库' ,'2008-9-25' ,'耗材' ,-5 ,5 ,-25
union select 'A004' ,'出库' ,'2008-9-25' ,'耗材' ,-7 ,5 ,-35
union select 'A004' ,'出库' ,'2008-10-24' ,'耗材' ,-10 ,5 ,-50
union select 'A004' ,'出库' ,'2009-1-15' ,'耗材' ,-5 ,5 ,-25
union select 'A004' ,'出库' ,'2009-2-11' ,'耗材' ,-4 ,5 ,-20
union select 'A004' ,'出库' ,'2009-4-15' ,'耗材' ,-10 ,5 ,-50
union select 'A004' ,'入库' ,'2008-6-5' ,'耗材' ,962 ,5 ,4810
union select 'A004' ,'入库' ,'2009-1-19' ,'原材料' ,100 ,9.4017 ,940.17
union select 'A004' ,'入库' ,'2009-3-31' ,'耗材' ,5 ,5 ,25union select 'A045' ,'出库' ,'2008-7-15' ,'原材料' ,-1 ,10 ,-10
union select 'A045' ,'出库' ,'2008-10-14' ,'原材料' ,-1 ,10 ,-10
union select 'A045' ,'出库' ,'2008-11-5' ,'原材料' ,-4 ,10 ,-40
union select 'A045' ,'出库' ,'2009-2-9' ,'原材料' ,-1 ,10 ,-10
union select 'A045' ,'入库' ,'2008-6-5' ,'原材料' ,8 ,10 ,80select * from @t
@Date Datetime='2007-02-15'
As
Declare @Bdate Datetime
Declare @Edate Datetime
Begin
Select @Bdate=Dateadd(dd,-(Datepart(dd,@Date)-1),@Date)
Select @Edate=Dateadd(dd,-1,Dateadd(mm,1,Dateadd(dd,-(Datepart(dd,@Date)-1),@Date)))
Select Cast(Datepart(mm,@Date) as Char(2)) As '月份',
Sum(Case When IoDate>= Dateadd(mm,-3,@Bdate) Then IOStockQnty Else 0 End ) As '3個月以內數量',
Sum(Case When ( IoDate>= Dateadd(mm,-6,@Bdate) and IoDate<Dateadd(mm,-3,@Bdate)) Then IOStockQnty Else 0 End ) As '3-6個月數量',
Sum(Case When IoDate< Dateadd(mm,-6,@Bdate) Then IOStockQnty Else 0 End ) As '6個月以上數量'
Into #數量
From stk_historyIO
Where IOStockQnty>0 Select Cast(Datepart(mm,@Date) as Char(2)) As '月份',
Sum(Case When IoDate>= Dateadd(mm,-3,@Bdate) Then dbo.PGetStockPrice(PartNum,Revision,@Bdate)*IOStockQnty Else 0 End ) As '3個月以內金額',
Sum(Case When ( IoDate>= Dateadd(mm,-6,@Bdate) and IoDate<Dateadd(mm,-3,@Bdate)) Then dbo.PGetStockPrice(PartNum,Revision,@Bdate)*IOStockQnty Else 0 End ) As '3-6個月金額',
Sum(Case When IoDate< Dateadd(mm,-6,@Bdate) Then dbo.PGetStockPrice(PartNum,Revision,@Bdate)*IOStockQnty Else 0 End ) As '6個月以上金額'
Into #金額
From stk_historyIO
Where IOStockQnty>0 Select Cast(Datepart(mm,@Date) as Char(2)) As '月份',
Sum(Case When t1.IoDate>= Dateadd(mm,-3,@Bdate) Then dbo.PDL_FunCalcArea(t1.PartNum,t1.Revision,t2.LLPiece,1)*IOStockQnty Else 0 End ) As '3個月以內面積',
Sum(Case When ( t1.IoDate>= Dateadd(mm,-6,@Bdate) and IoDate<Dateadd(mm,-3,@Bdate)) Then dbo.PDL_FunCalcArea(t1.PartNum,t1.Revision,t2.LLPiece,1)*IOStockQnty Else 0 End ) As '3-6個月面積',
Sum(Case When t1.IoDate< Dateadd(mm,-6,@Bdate) Then dbo.PDL_FunCalcArea(t1.PartNum,t1.Revision,t2.LLPiece,1)*IOStockQnty Else 0 End ) As '6個月以上面積'
Into #面積
From stk_historyIO t1,ProdBasic t2
Where t1.PartNum=t2.PartNum
And t1.Revision=t2.Revision
And t1.IOStockQnty>0
Select *
From #數量 t1,#金額 t2,#面積 t3
Where t1.月份=t2.月份 and t1.月份=t3.月份 End
--测试数据,我插入的数据记录比较多,大家也可以自定义些数据,不要那么多。
create table tb(
物料编码 varchar(20),
出入库类别 varchar(20) ,
出入库日期 datetime,
物资类别 varchar(20),
数量 float,
单价 money,
总金额 money
)
insert tb
select 'A004' ,'出库' ,'2008-8-5' ,'耗材' ,-40 ,5 ,-200
union select 'A004' ,'出库' ,'2008-8-5' ,'耗材' ,-100 ,5 ,-500
union select 'A004' ,'出库' ,'2008-9-25' ,'耗材' ,-5 ,5 ,-25
union select 'A004' ,'出库' ,'2008-9-25' ,'耗材' ,-7 ,5 ,-35
union select 'A004' ,'出库' ,'2008-10-24' ,'耗材' ,-10 ,5 ,-50
union select 'A004' ,'出库' ,'2009-1-15' ,'耗材' ,-5 ,5 ,-25
union select 'A004' ,'出库' ,'2009-2-11' ,'耗材' ,-4 ,5 ,-20
union select 'A004' ,'出库' ,'2009-4-15' ,'耗材' ,-10 ,5 ,-50
union select 'A004' ,'入库' ,'2008-6-5' ,'耗材' ,962 ,5 ,4810
union select 'A004' ,'入库' ,'2009-1-19' ,'原材料' ,100 ,9.4017 ,940.17
union select 'A004' ,'入库' ,'2009-3-31' ,'耗材' ,5 ,5 ,25
union select 'A045' ,'出库' ,'2008-7-15' ,'原材料' ,-1 ,10 ,-10
union select 'A045' ,'出库' ,'2008-10-14' ,'原材料' ,-1 ,10 ,-10
union select 'A045' ,'出库' ,'2008-11-5' ,'原材料' ,-4 ,10 ,-40
union select 'A045' ,'出库' ,'2009-2-9' ,'原材料' ,-1 ,10 ,-10
union select 'A045' ,'入库' ,'2008-6-5' ,'原材料' ,8 ,10 ,80
go
CREATE PROCEDURE 帐龄计算
@d datetime
AS
SET NOCOUNT ON;
select 物资类别,物料编码,datediff(dd,min(出入库日期),@d) as 账龄,
sum(case when 出入库类别='入库' then 数量 else 数量*(-1) end) as 数量,
sum(case when 出入库类别='入库' then 数量*单价 else 数量*(-1)*单价 end) as 总金额
from tb group by 物资类别,物料编码
GO
exec 帐龄计算 '2009-03-01'
go
drop procedure 帐龄计算
drop table tb
/*
物资类别 物料编码 账龄 数量 总金额
-------------------- -------------------- ----------- ---------------------- ----------------------
耗材 A004 269 1148 5740
原材料 A004 41 100 940.17
原材料 A045 269 15 150
*/