先进先出的迷惑

qqzeng-ip 2009-11-21 06:31:29
 declare @t decimal(18, 0),@temp decimal(18, 0)
select @t=20
update #tmp set @temp=
case when @t>进库数量-已出数量
then 进库数量-已出数量
else @t
end,
@t=@t-@temp,
已出数量=@temp+已出数量
where 已出数量<>进库数量
select * from #tmp


先进先出的迷惑 为什么要
@t=@t-@temp,
已出数量=@temp+已出数量

它有什么作用,为什么要这样?
我看不明白 指点下!
...全文
188 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
hovoy 2009-11-23
  • 打赏
  • 举报
回复
虽然,看不明白,但这个算法太经典了。

困惑多年的算法。实在是强。Mark
freeflight001 2009-11-22
  • 打赏
  • 举报
回复


先进先出的迷惑  为什么要
@t=@t-@temp,//@t是一次的总出库数量,@temp是一次单价的出库数量,
即从总出库数量扣除某一单价的出库数量
上面这句话比较关键,当@t为零时,不会影响到“已出数量”,因为:0+已出数量=已出数量
已出数量=@temp+已出数量 //当次计算要扣除出库数量+已前曾经已出库的数量。
它有什么作用,为什么要这样?
我看不明白 指点下!
freeflight001 2009-11-22
  • 打赏
  • 举报
回复


declare @t decimal(18, 0) --一次出库数量
,@temp decimal(18, 0) --某一单价的临时出库数量
select @t=20
update #tmp set @temp=
case when @t>进库数量-已出数量
then 进库数量-已出数量 --当出库数量大于某一单价的结存数量时,那么此单价的出库数量就是结存数量,也就是说此单价的库存数量全部消耗完。
else @t --出库数量小于或等于某一单价的结存数量时,那么此次的出库数量就是实际的出库数量
end,
@t=@t-@temp,--减去一次针对某个单价的临时出库数量
已出数量=@temp+已出数量 --新出库的数量+以前出库的数量
where 已出数量<>进库数量 --某个单价出库完了就不参于出库计算,即结存数为零的就排除在外
select * from #tmp
icelovey 2009-11-22
  • 打赏
  • 举报
回复
有请楼下~~
qqzeng-ip 2009-11-22
  • 打赏
  • 举报
回复
贴出来了 弄不明白 解释下
qqzeng-ip 2009-11-22
  • 打赏
  • 举报
回复
 CREATE TABLE #tmp 
( ID int IDENTITY (1, 1),
单价 decimal(18, 2) NOT NULL ,
进库数量 decimal(18, 0) NOT NULL ,
已出数量 decimal(18, 0) NOT NULL
)
insert into #tmp(单价,进库数量,已出数量) values(1.1,50,0)
insert into #tmp(单价,进库数量,已出数量) values(1.3,30,0)
insert into #tmp(单价,进库数量,已出数量) values(1.4,60,0)
insert into #tmp(单价,进库数量,已出数量) values(1.5,20,0)


select * from #tmp


declare @t decimal(18, 0),@temp decimal(18, 0)
select @t=20
update #tmp set @temp=
case when @t>进库数量-已出数量
then 进库数量-已出数量
else @t
end,
@t=@t-@temp,
已出数量=@temp+已出数量
where 已出数量<>进库数量
select * from #tmp


set @t=40
update #tmp set @temp=
case when @t>进库数量-已出数量
then 进库数量-已出数量
else @t
end,
@t=@t-@temp,
已出数量=@temp+已出数量
where 已出数量<>进库数量

select * from #tmp

go
drop table #tmp

qqzeng-ip 2009-11-22
  • 打赏
  • 举报
回复
大虾呢?
dawugui 2009-11-21
  • 打赏
  • 举报
回复
最好给出表结构,测试数据,计算方法和正确结果.
icelovey 2009-11-21
  • 打赏
  • 举报
回复
感觉先进先出的原理是这样的
先看仓存够不够, 不够的话直接提示仓存不够
够的话, 直接去最后入仓的货物先扣仓存, 如果最后入仓的不够, 再去前面的, 依此。。
icelovey 2009-11-21
  • 打赏
  • 举报
回复
语句是看明白是意思, 但是和先进先出。。等楼下~

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧