2017-04-04 98 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的下一行(按年份列的升序排列),並計算後續行的運行總數和興趣。