有一个表A,它有开始和结束日期,价格和CurrencyCode。 有一张表B,其中包含历史+今天的汇率。 我需要根据以下假设转换表A价格:
基本上,我需要获得WeekStart持续时间的平均汇率 - WeekEnd Date。
以下是表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 Dates:
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中的历史汇率计算起始端的平均值。
我认为这可以通过功能完成吗?那将是最好的方法。如果是这样,那么函数实现会是什么样子。
答案 0 :(得分:1)
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]创建一个Tally表,它基本上会使您的1周长记录为x#天。这是0基础,所以6实际上是7天。
将其加入订单,使用。
每天创建一行将其加入您的汇率表,使用类似的案例陈述到我之前的答案,该陈述说明当日期是> =今天然后使用今天的加入日期。注意我正在使用左连接,以防您丢失数据。
然后进行聚合并获得平均值。