2017-04-04 63 views
2

我有一个需求来计算pl/sql中多个账户的滚动复利。我正在寻找关于如何脚本计算这些计算的帮助/建议。我需要的计算结果在下面输出的最后两列(利息总额和运行总额)中。我在这里发现了类似的例子,但没有特别适合pl/sql中的这些需求。我也是CTE /递归技术的新手,我发现的模型技术需要一个特定的迭代,在这种情况下可能是可变的。请参阅我下面的问题:累计计算利息计算(Oracle数据库11g第2版)

计算:

  • INTERESTAMOUNT =(上年度运行总计+本年金额)* INTEREST_RATE
  • RUNNINGTOTAL =(上年度运行总计+本年金额)*(1 + INTEREST_RATE ) - CURRENT YEAR开支

输入表:

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 
+0

前一年的总成绩是多少?我在两次计算中都看到了它。 –

+0

对不起,对于ACCT_ID 1,最初一年将是2002年,不包括上一年,运行总和将计算为: 1000 *(1 + 0.05315)-70 = 983.15 滚动化合物计算将开始于(983.15 + 1500)*(1 + 0.04213)-80 = 2507.77。 – Sisirclausac

+0

你在你的问题中提到了pl/sql ...我认为你的意思是Oracle SQL? pl/sql是一种单独的编程语言,它可以用来解决你的问题,但一般的建议是只有当你的问题不能用普通的SQL解决时才使用pl/sql。你当前的问题**可以用普通的SQL解决,所以你不应该需要pl/sql,除非有其他的考虑你没有发布。请确认。 – mathguy

回答

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的下一行(按年份列的升序排列),并计算后续行的运行总数和兴趣。