累积计算机利息计算(Oracle Database 11g第2版)

时间:2017-04-04 16:30:14

标签: sql oracle oracle11g

我需要在pl / sql中的几个帐户上计算滚动化合物的兴趣。我正在寻找关于如何编写这些计算的脚本的帮助/建议。我需要的计算是在下面输出的最后两列(INTERESTAMOUNT AND RUNNING TOTAL)。我在这里找到了类似的例子,但没有特别适合pl / sql中的这些要求。我也是CTE /递归技术的新手,我发现的模型技术需要一个特定的迭代,在这种情况下它是可变的。请在下面查看我的问题:

计算:

  • INTERESTAMOUNT =(上一年度运行总额+当前年度金额)* INTEREST_RATE
  • RUNNINGTOTAL =(上一年运行总量+当前年度金额)*(1 + INTEREST_RATE) - 当前年度费用

输入表:

YEAR    ACCT_ID AMOUNT  INTEREST_RATE   EXPENSES 
    2002    1       1000    0.05315         70  
    2003    1       1500    0.04213         80  
    2004    1       800     0.03215         75  
    2005    1       950     0.02563         78  
    2000    2       750     0.07532         79  
    2001    2       600     0.06251         75  
    2002    2       300     0.05315         70  

期望的输出:

 YEAR   ACCT_ID AMOUNT  INTEREST_RATE   EXPENSES    INTERESTAMOUNT RUNNINGTOTAL
    2002    1       1000    0.05315         70          53.15          983.15
    2003    1       1500    0.04213         80          104.62         2507.77
    2004    1       800     0.03215         75          106.34         3339.11
    2005    1       950     0.02563         78          109.93         4321.04
    2000    2       750     0.07532         79          56.49          727.49
    2001    2       600     0.06251         75          82.98          1335.47
    2002    2       300     0.05315         70          86.93          1652.4

1 个答案:

答案 0 :(得分:3)

一种方法是使用递归cte。

with rownums as (select t.*
                 ,row_number() over(partition by acct_id order by yr) as rn 
                 from t) -- t is your tablename
,cte(rn,yr,acct_id,amount,interest_rate,expenses,running_total,interest_amount) as 
 (select rn,yr,acct_id,amount,interest_rate,expenses
  ,(amount*(1+interest_rate))-expenses
  ,amount*interest_rate
  from rownums
  where rn=1
  union all
  select t.rn,t.yr,t.acct_id,t.amount,t.interest_rate,t.expenses
  ,((c.running_total+t.amount)*(1+t.interest_rate))-t.expenses
  ,(c.running_total+t.amount)*t.interest_rate
  from cte c
  join rownums t on t.acct_id=c.acct_id and t.rn=c.rn+1
 )
select * from cte  

Sample Demo

  • 使用row_number函数
  • 生成行号
  • 计算每个acct_id的第一行的兴趣和运行总计(递归cte中的锚点)。
  • 为每个account_id加入每一行到下一行(按年份列的升序排序),并计算后续行的运行总数和兴趣。