这是一个从仓库取出商品的情景:有一个库存表,每条记录对应一次进货。现在要卖一种商品A,系统就从库存表搜索出所有A商品的进货记录。比如结果是id 商品名称 库存数量 进货日期
1 A 100 2001年9月7日
4 A 57 2008年12月5日
现在系统让人选择从哪批中取,我想让他达到自动选择的效果:优先选最早的进货批次,如果单个批次数量不够那么就组合多个批次,直到够用。请问这个功能能不能通过一条或几条sql语句完成?或者需要java计算一下再决定?请大家提供个思路就好~~非常感谢
1 A 100 2001年9月7日
4 A 57 2008年12月5日
现在系统让人选择从哪批中取,我想让他达到自动选择的效果:优先选最早的进货批次,如果单个批次数量不够那么就组合多个批次,直到够用。请问这个功能能不能通过一条或几条sql语句完成?或者需要java计算一下再决定?请大家提供个思路就好~~非常感谢
解决方案 »
- java 打成jar包以后就会失去对文件的读写操作?
- igoogle设计
- 还请大家帮忙!关于java构造函数的一个小问题
- 怎样把一个字符复制N次,如 'a'变成'aaaaa'
- 我想问一问大家对张孝祥培训的意见
- 一直在想一个菜鸟问题:java没了指针用什么来代替??
- Jtable中如何实现某个单元输入错误数据后清除错误数据恢复原数据?
- 请问如何才能让JTable中在表格不能被选中
- 请问到2004的现在,我能用JSP完成一套分销系统,能在北京赚多少钱????
- 大家好,请问这两个程序为什么不能达到同样的效果
- 同思路,不同方式写出来的东西,运行出来怎么不一样呢?
- 一个奇怪的问题,为什么我画不出图片来?
先查处最早的进货批次的库存,与需要的量比较下,不行的话 再查一个,知道大于需要的量
先按日期sql取出所有数据,
写个for循环 从最早的一批商品开始,当单个批次不够就累计叠加到下一条数据,累计下一条时候,可以sql假删除这条数据 直到满足数量为止,当最后一批有剩余时,update本条数据为剩余量。只是个大概思路不知道行不行
From (
Select @sumamount:=@sumamount+amount sumamount, @tmpid:=@tmpid+1 tmpid, name, amount, indate
From (
SELECT @sumamount:=0, @tmpid:=0, name, amount, indate
From product
Where name='A'
Order By indate
) tmp1
) a, -- 这个子句是查出所有的,然后靠b子句来过滤掉超出部分
(
Select tmpid
From (
Select @sumamount:=@sumamount+amount sumamount, @tmpid:=@tmpid+1 tmpid, name, amount, indate
From (
SELECT @sumamount:=0, @tmpid:=0, name, amount, indate
From product
Where name='A'
Order By indate
) tmp2
) main
Where sumamount>=40
Limit 1
) b --这个子句主要是为了得到刚好能满足汇总amount的rownum值
Where a.tmpid <= b.tmpid
虽然能实现,不过又丑陋,性能又差。
(select rownum rn1,kc1.indate from kc kc1 where kc1.name='A')
where
(select sum(num) from kc kc3 where rownum<=rn1)>=70 order by indate;只能得到前几行能够满足要求,但是最后更新数据还是实现不了。。
select id, 商品名称, 进货日期, 库存数量, sum(库存数量) over (order by 进货日期 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as 累计数量和 from 表
这个结果应该是这样的
id 商品名称 库存数量 进货日期 累计数量和
1 A 100 2001年9月7日 100
4 A 57 2008年12月5日 157
可以用rownum,显然是Oracle,SQL能力强大很多。MySQL没有rownum,累加统计能力也受限,搞死个人。是想一句话连Update都搞定?这个看起来如果想纯SQL搞定的话,不用存储过程很难了。