本範例為類似零存整付之複利報酬程式開發作業,通常會以程式迴圈方式處理,在此提供以遞迴運算指令以一組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僅提供固定以10或e為底之對數函數,但可用換底作法處理(如上)。