我正在寻找有关在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等。
答案 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