这是一个从仓库取出商品的情景:有一个库存表,每条记录对应一次进货。现在要卖一种商品A,系统就从库存表搜索出所有A商品的进货记录。比如结果是id  商品名称  库存数量      进货日期
1      A        100       2001年9月7日
4      A        57        2008年12月5日
现在系统让人选择从哪批中取,我想让他达到自动选择的效果:优先选最早的进货批次,如果单个批次数量不够那么就组合多个批次,直到够用。请问这个功能能不能通过一条或几条sql语句完成?或者需要java计算一下再决定?请大家提供个思路就好~~非常感谢

解决方案 »

  1.   

    我觉得在java中实现比较简单吧
    先查处最早的进货批次的库存,与需要的量比较下,不行的话 再查一个,知道大于需要的量
      

  2.   

    我感觉sql不好写,还是用java控制吧!!
      

  3.   

    用java吧,
    先按日期sql取出所有数据,
    写个for循环 从最早的一批商品开始,当单个批次不够就累计叠加到下一条数据,累计下一条时候,可以sql假删除这条数据 直到满足数量为止,当最后一批有剩余时,update本条数据为剩余量。只是个大概思路不知道行不行
      

  4.   

    用SQL返回多条,然后程序循环处理,这个简单:SQL这边只需要 “Order By 进货日期” 就完毕了。Mark下,明天试试看是否能不借助程序,1条SQL语句搞定。
      

  5.   

    不知道你是什么数据库,假设为MySQL吧:Select * 
    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
    虽然能实现,不过又丑陋,性能又差。
      

  6.   

    查找所有为A的ID存放到数组arr里  然后对数组arr里所有的ID进行select查找记录显示到表里
      

  7.   

    大虾  我也写出来一个~ 比如要卖出去70个:SQL> select min(rn1) from 
    (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;只能得到前几行能够满足要求,但是最后更新数据还是实现不了。。
      

  8.   

    我记得有个  over (partition by) 的分析函数 可以实现排序从上到下一次是累加之前的结果的,你可以找找看有用没
      

  9.   

    找到了
    select id, 商品名称, 进货日期, 库存数量, sum(库存数量) over (order by  进货日期 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as 累计数量和 from 表
      

  10.   


    这个结果应该是这样的
    id  商品名称  库存数量      进货日期            累计数量和
    1      A        100       2001年9月7日        100
    4      A        57        2008年12月5日       157
      

  11.   


    可以用rownum,显然是Oracle,SQL能力强大很多。MySQL没有rownum,累加统计能力也受限,搞死个人。是想一句话连Update都搞定?这个看起来如果想纯SQL搞定的话,不用存储过程很难了。