例如:
新增赠款表A       
A1           A2           A3                          A4
账本:1004   赠款:10元   赠款时间: 7月10日1点,      无值
账本:1008   赠款: 5元    赠款时间: 7月10日2点;      无值
账本:1008   赠款: 10元    赠款时间: 7月10日3点;     无值销帐表B        只有15元的销帐记录
B1
15现在要在新增赠款表A中后面某字段A4增加销帐金额,这个值的SQL该如何取数?? 
规则如下:按照时间先到先销
(例如赠款时间: 7月10日1点 销帐金额此处因该为:10元,赠款时间: 7月10日2点 销帐金额为5元 ,赠款时间: 7月10日3点 销帐金额为 0元)

解决方案 »

  1.   

    结果数据为:
    新增赠款表A   
    A1 A2 A3 A4
    1004 10 201207100100 10
    1008 5  201207100200 5
    1008 10 201207100300 0
      

  2.   

    这我知道,关键是update A 的语句如何写?
      

  3.   

    with a as
    (select 10 aa,1 bb from dual
    union all
    select 8,2 from dual
    union all
    select 10,3 from dual
    ),
    b as
    (
      select 25 cc,1 dd from dual
    )select aa,bb,case when (dd<0 and ee is null) then cc  when dd>=0 then aa  when ee>=0 then ee else 0  end cc  from 
    (
        select aa,bb,cc,cc-ee dd,lag(cc-ee)over(partition by dd order by bb) ee
        from 
            (
                   select aa,bb,cc,dd,sum(aa)over(partition by dd order by bb) ee from a,b
            )
    )
    --写好了!
    --结果集为:
    10 1 10
    8 2 8
    10 3 7--分别测试: 9,17,18,25,28,29  --都OK。--最后一行就是你要的数据
    --增加第四行测试也OK。
      

  4.   

    非常感谢 cosio 的帮助,
    上面的语句案例只是其中一个号码的情况,但是如果有上千万的用户数据,估计上面的语句此办法行不通,
    我想试试看通过存储过程加上循环判断来处理,不知道有没有更好的办法(比如分析函数之类的)。欢迎大家交流。
      

  5.   

    两个表没有必然的主键或者外键的关联 只有那个金额的合计跟时间先后的关系 
    这个还是要个存储过程来处理好点 单个SQL有点困难了 
      

  6.   


    select t.a1,t.a2,t.a3,(case        when s <= 0 then         t.a2        else         decode(sign(t.a2 - t.s), -1, 0, t.a2 - t.s)      end) a4 from (select a.a1, a.a2, a.a3, sum(a.a2) over(order by a.a3) - 14 s         from a) thttp://space.itpub.net/24867611/viewspace-736178