2017-04-04 5 views
2

私は、pl/sqlの複数のアカウントでローリング複合金利を計算する必要があります。私は助けを求めていた/どのようにこれらの計算を計算するスクリプトのアドバイス。私が必要とする計算は、以下の出力の最後の2つの列にあります(要約と実行合計)。私はここでこれと似た例を見つけましたが、pl/sqlでこれらの要件に特に適合するものは何も見つかりませんでした。私はCTE/Recursive Techniquesも新しく、このケースでは変わる可能性のある特定の反復が必要であることがわかったモデル技法です。累積Compoud Interest Calculation(Oracle Database 11g Release 2)

計算::

  • INTERESTAMOUNT =(前年同期はTOTAL +現在の年金額をRUNNING)* INTEREST_RATE
  • 積算合計=(前年同期はTOTAL +現在の年金額をRUNNING)*(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 
+0

前年度の合計は何ですか?私は両方の計算でそれを参照してください。 –

+0

申し訳ありませんが、ACCT_ID1の場合、前年は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のアンカー)するための第1の行の合計を実行してを計算します。
  • account_idごとに、すべての行を次の列に昇順に並べ替えて、後続の行の合計と金利を計算します。
関連する問題