关于事务的SQL Server兴趣计算

时间:2017-01-25 12:53:42

标签: sql sql-server stored-procedures

我正在寻找有关在SQL Server中构建复合兴趣模块的最佳方法的建议。基本设置: 表:事务{TransID,MemberID,Trans_Date,Trans_Code,Trans_Value)。 表:兴趣{IntID,Int_eff_Date,Int_Rate}

在利息表中,可能会有不同的生效日期费率 - 但永远不会有超过研磨日期。例如:

Int_Eff_Date       Int_Rate
01/01/2016         7%
01/10/2016         7.5%
10/01/2017         8%

我想根据交易日期和交易价值计算利息,其中相对于交易日期适用正确的利率。

因此,如果Table事务有:

TransID   MemberID    Trans_Date    Trans_Value
1         1            15/04/2016    150
2         1            18/10/2016    200
3         1            24/11/2016    200
4         1            15/01/2017    250

对于transID 1,2016年4月15日至2016年9月30日(168天)将从2016年1月10日至2017年1月9日使用7%,它将使用7.%然后从10 / 01/2007到计算日期(输入参数)它将使用8%。

它将对所有交易应用类似的方法,将它们相加并显示利息价值。

我不确定是否应该使用游标,UDF等。

1 个答案:

答案 0 :(得分:0)

这应该概述你要做的事情。

--Build Test Data
CREATE TABLE #Rates(Int_Eff_Date DATE
                    , Int_Rate FLOAT)
CREATE TABLE #Transactions(TransID INT
                            ,MemberID INT
                            ,Trans_Date DATE
                            ,Trans_Value INT)

INSERT INTO #Rates     
VALUES  ('20160101',7)
        ,('20161001',7.5)
        ,('20170110',8)

INSERT INTO #Transactions
VALUES 
(1,1,'20160415',150)
,(2,1,'20161018',200)
,(3,1,'20161124',200)
,(4,1,'20170115',250)


;WITH cte_Date_Rates
    AS
    (
    SELECT 
        S.Int_Eff_Date
        ,ISNULL(E.Int_Eff_Date,'20490101') AS "Expire"
        ,S.Int_Rate
    FROM
        #Rates S 
            OUTER APPLY (SELECT TOP 1 Int_Eff_Date 
                        FROM #Rates E 
                        WHERE E.Int_Eff_Date > S.Int_Eff_Date
                        ORDER BY E.Int_Eff_Date) E 
    )
SELECT
    T.*
    ,R.Int_Rate
FROM
    #Transactions T 
        LEFT JOIN cte_Date_Rates R
            ON
            T.Trans_Date >= R.Int_Eff_Date
            AND
            T.Trans_Date < R.Expire