SQL處理庫存與銷售,先進先出原則

--庫存表
create table t( id int identity(1,1),
name
varchar(50),--商品名稱
j int, --入庫數量
c int,        --出庫數量
jdate datetime --入庫時間
)
insert into t(name,j,c,jdate) select  'A',100,0,'2007-12-01'
insert into t(name,j,c,jdate) select  'A',200,0,'2008-01-07'
insert into t(name,j,c,jdate) select  'B',320,0,'2007-12-21'
insert into t(name,j,c,jdate) select  'A',100,0,'2008-01-15'
insert into t(name,j,c,jdate) select  'B',90,0,'2008-02-03'
insert into t(name,j,c,jdate) select  'A',460,0,'2008-02-01'
insert into t(name,j,c,jdate) select  'A',510,0,'2008-03-01'
go



create   proc wsp
@name varchar(50),
@cost int--,--銷售量
--
@returns int output --該貨物的庫存是否夠(不夠:-1;夠:1)
as
--先得出該貨物的庫存是否夠
declare @spare float --剩餘庫存
select @spare=sum(j)-sum(c) from t where name=@name
if(@spare>=@cost)
begin
   
--根據入庫日期採用先進先出原則對貨物的庫存進行處理
    update t set c=
   
case when (select @cost-isnull(sum(j),0)+isnull(sum(c),0) from t where name=@name and jdate<=a.jdate and j!=c)>=0
   
then a.j
   
else
       
case when (select @cost-isnull(sum(j),0)+isnull(sum(c),0) from t where name=@name and jdate<a.jdate and j!=c)<0 then 0
       
else (select @cost-isnull(sum(j),0)+isnull(sum(c),0)+a.c from t where name=@name and jdate<a.jdate and j!=c)
       
end
   
end
   
from t a where name=@name and j!=c
end
else
   
raiserror('庫存不足',16,1)   
   
return
go


--測試:

exec wsp @name='A',@cost=390
select * from t

--刪除測試環境
drop table t
drop proc wsp

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章