[英]Getting Exchange Rates for Historical and Using Today's Rate for Future Dates
有一个表A,其中包含开始和结束日期,价格和货币代码。 有一个表B,该表具有历史+今天的汇率。 我需要根据以下假设转换表A价格:
基本上,我需要获取WeekStart的持续时间-WeekEnd日期的平均汇率。
这是表B的架构/一些示例数据,其中包含汇率。
DateTime Date FromCurrCode ToCurrCode Rate 2016-07-07 07:16:12.000 2016-07-07 USD CAD 1.2939 2016-07-06 07:27:12.000 2016-07-06 USD CAD 1.3017 2016-07-05 07:34:07.000 2016-07-05 USD CAD 1.2922 2016-07-04 07:42:07.000 2016-07-04 USD CAD 1.2853 2016-07-03 07:52:06.000 2016-07-03 USD CAD 1.2908 2016-07-02 07:06:08.000 2016-07-02 USD CAD 1.2915
这是表A的模式/示例数据,其具有WeekStart和WeekEnd日期:
order# WeekStart WeekEnd Curr 1256 2016-07-04 00:00:00.000 2016-07-10 00:00:00.000 USD 1255 2016-07-04 00:00:00.000 2016-07-10 00:00:00.000 USD
根据表B,由于结束日期是将来的日期,因此平均费率应按以下方式计算:
2016-07-04 ---- Use historical currency
2016-07-05 ---- Use historical currency
2016-07-06 ---- Use historical currency
2016-07-07 ---- Use today's currency rate
2016-07-08 ---- Use today's currency rate
2016-07-09 ---- Use today's currency rate
2016-07-10 ---- Use today's currency rate
然后,使用上面的这些比率,它将为表A中的每一行返回平均比率作为一列。
但是,如果WeekStart和WeekEnd日期是过去的日期,并且小于今天的日期,则它将仅使用表B中的历史汇率来计算Start-End的平均值。
我是否可以假定可以通过函数完成操作? 那将是最好的方法。 如果是这样,函数实现将是什么样子。
DECLARE @ToCurrCode CHAR(3) = 'CAD'
;WITH cteTally AS (
SELECT 0 AS I
UNION ALL
SELECT I + 1 AS I
FROM
cteTally
WHERE i + 1 <= 6
)
SELECT
a.OrderNum
,AVG(b.Rate) AS AvgRate
FROM
TableA a
INNER JOIN cteTally t
ON DATEDIFF(day,a.WeekStart,a.WeekEnd) >= t.I
LEFT JOIN TableB b
ON (CASE
WHEN DATEADD(day,t.i,a.WeekStart) <= CAST(GETDATE() AS DATE) THEN DATEADD(day,t.i,a.WeekStart)
ELSE CAST(GETDATE() AS DATE)
END) = b.[Date]
AND a.Curr = b.FromCurrCode
AND b.ToCurrCode = @ToCurrCode
GROUP BY
a.OrderNum
用递归公用表表达式[CTE]创建一个理货表,这实际上将使您长达1周的记录变成x#天。 这是基于0的,所以6实际上是7天。
将其加入订单以使用创建每天的一行。
将其加入您的汇率表,使用与我之前的答案类似的案例声明,即当日期> =今天时,然后使用今天的日期进行加入。 注意,如果您缺少数据,我将使用左联接。
然后进行汇总,得出平均值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.