基于金额更新值的oracle程序

时间:2015-12-08 14:42:05

标签: oracle

我有下表(SEMINARS):

ID          AMOUNT
6936120606  320.51
6978332460  261.05
6940456367  0
6973328053  438.68
6951690568  533.56

sum(1690.47)

我有价值980,我需要逐个记入研讨会金额 从最大量到最低量。

例如,980值必须归功于以下内容:

6951690568  533,56 (-533.56)=0         446.44 (980.00-533.56=446.44)
6973328053  438,68 (-438.68)=0           7.76 (446.44-438.68=  7.76)
6936120606  320,51 (-  7.76)=312.75      0.00 (0)

任何想法?

1 个答案:

答案 0 :(得分:1)

在Oracle 11g中,你可以使用递归查询,这给了我想要的输出:

with 
  s as (select row_number() over (order by amount desc) rn, id, amount from seminars),
  t(rn, id, amount, left1, left2) as (
    select rn, id, amount, greatest(amount-980,0), 980-amount from s where rn = 1
    union all 
    select s.rn, s.id, s.amount, 
           s.amount-least(left2, s.amount), greatest(left2-s.amount, 0) 
      from s join t on s.rn = t.rn+1 and left2>0)
select * from t

输出和SQLFiddle

        RN ID                  AMOUNT      LEFT1      LEFT2
---------- --------------- ---------- ---------- ----------
         1 6951690568          533.56          0     446.44
         2 6973328053          438.68          0       7.76
         3 6936120606          320.51     312.75          0