[英]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.