先进先出SQL Server 语句

--> 测试数据:[m]
if object_id('[m]') is not null drop table [m]
go 
Create table m ( ID int not NULL , mCount int not NULL ,mTime datetime not null) 
INSERT into m(ID,mCount,mTime) 
SELECT 1,50,'2014-02-01' UNION ALL
SELECT 1,60,'2014-02-02' UNION ALL
SELECT 2,50,'2014-02-01' UNION ALL
SELECT 2,60,'2014-02-03' UNION ALL
SELECT 2,60,'2014-02-04' UNION ALL
SELECT 2,40,'2014-02-02' UNION ALL
SELECT 1,70,'2014-02-03' UNION ALL
SELECT 1,80,'2014-02-04' 

select * from m
/*
ID          mCount      mTime
----------- ----------- -----------------------
1           50          2014-02-01 00:00:00.000
1           60          2014-02-02 00:00:00.000
2           50          2014-02-01 00:00:00.000
2           60          2014-02-03 00:00:00.000
2           60          2014-02-04 00:00:00.000
2           40          2014-02-02 00:00:00.000
1           70          2014-02-03 00:00:00.000
1           80          2014-02-04 00:00:00.000

(8 行受影响)

*/

declare @i int 
set @i =80  --定义出货总数量
select a.id,a.mcount ,a.mtime,
case when a.mcount-(a.tmcount-@i) <0 then 0  when a.tmcount<@i then a.mcount else a.mcount-(a.tmcount-@i)end as '出货数量' 
from
(
select a.*,sum(isnull(b.mcount,0)) as Tmcount from m a left join m b on a.mtime>=b.mtime and a.id=b.id
group by a.id,a.mcount,a.mtime
)a 
/*
id          mcount      mtime                   出货数量
----------- ----------- ----------------------- -----------
1           50          2014-02-01 00:00:00.000 50
1           60          2014-02-02 00:00:00.000 30
1           70          2014-02-03 00:00:00.000 0
1           80          2014-02-04 00:00:00.000 0
2           40          2014-02-02 00:00:00.000 30
2           50          2014-02-01 00:00:00.000 50
2           60          2014-02-03 00:00:00.000 0
2           60          2014-02-04 00:00:00.000 0

(8 行受影响)

*/

一般来说,在实际业务中不可能所有的种类都是出库80;这里仅做一个例子,来看看多个种类的效果。

在很多业务中,每种物品出库的数量是不一样的,所以在先进先出的时候需要循环每个物品。

ps.本例没取用同一天进货两次的情况;如果一天进货两次,需要先进行按天按品种进行汇总后再出库。(有的货物不看进货日期,而是看有效期、或者批号、批次;所以分组条件也需要跟着更新。eg.药品,可能今天进的是1号生产的,而昨天进的是3号生产的;在出库时,需要先出今天进的1号生产的。)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值