例如:
新增赠款表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元)
新增赠款表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元)
新增赠款表A
A1 A2 A3 A4
1004 10 201207100100 10
1008 5 201207100200 5
1008 10 201207100300 0
(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。
上面的语句案例只是其中一个号码的情况,但是如果有上千万的用户数据,估计上面的语句此办法行不通,
我想试试看通过存储过程加上循环判断来处理,不知道有没有更好的办法(比如分析函数之类的)。欢迎大家交流。
这个还是要个存储过程来处理好点 单个SQL有点困难了
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