2018年3月27日 星期二

利用CTE遞迴計算零存整付複利報酬以及應用數學推導解決問題

本範例為類似零存整付之複利報酬程式開發作業,通常會以程式迴圈方式處理,在此提供以遞迴運算指令以一組SQL指令完成所需,一位網友提供以財務公式直接計算求得,利用數學概念取代原有迴圈邏輯,以下列出公式推導過程及SQL
假設抵達目標金額是1000萬,選擇一個年投資報酬率10%的產品,每月固定投資2萬元,請問要多久才可以抵達目標?

提示:複利計算公式 S = P(I + r)^n (^在這裡是表示次方)
輸出範例:XX年後可以達到目標

方法1: CTE (Common Table Expression)
首先使用CTE (Common Table Expression)以遞迴運算處理此問題,請注意ORACLE雖在9i版本即已提供WITH指令,但僅具暫作用,11g R2版本後才提供遞迴運算功能,SQL及運行結果如下。

MSSQL 2005
ORACLE 11g R2
SQL
WITH RESULT(N, AMT, Interest)
AS
(
SELECT 1
, CAST(2 AS FLOAT)
, CAST(0 AS FLOAT)
UNION ALL
SELECT N+1
, AMT*(1+ 0.1/12) + 2
, AMT*(0.1/12)
FROM RESULT
WHERE AMT < 1000
--WHERE AMT*(1+ 0.1/12) + 2 < 1000
)
SELECT *
FROM RESULT
OPTION (maxrecursion 500)
WITH RESULT(N, AMT, Interest)
AS
(
SELECT 1
, CAST(2 AS FLOAT)
, CAST(0 AS FLOAT)
FROM DUAL
UNION ALL
SELECT N+1
, AMT*(1+ 0.1/12) + 2
, AMT*(0.1/12)
FROM RESULT
WHERE AMT < 1000
)
SELECT *
FROM RESULT
結果

方法2: 數學
參考網友所回覆之方法,以下撰寫數學推論過程。



MSSQL 2005
ORACLE 11g R2
SQL
SELECT LOG(1000/2*0.1/12+1)
/ LOG(1+0.1/12)
SELECT LOG((1+0.1/12), (1+10000000/20000 *0.1/12))
FROM DUAL

請注意,MSSQL僅提供固定以10e為底之對數函數,但可用換底作法處理(如上)。

2 則留言:

  1. 您好 請問您是SQL案例解析︰以SQL Server與Oracle為例 這本書的作者嗎? 我大約8年前還是學生時看過您的大作,不過當時還是學生覺得您的書太困難所以沒買,至今仍相當懊悔,是否還有什麼管道可以購得該著作呢?

    回覆刪除
    回覆
    1. 謝謝,此為拙著,不過書在2013年就絕版了。
      (您是台科大、淡江或中華大學的畢業? 我記得這三所學校拿來當教科書)。

      刪除