Nejprve byste se mohli sami připojit ke směnným kurzům, které jsou seřazeny podle data, abyste měli počáteční a koncové datum každého směnného kurzu bez jakéhokoli překrývání nebo mezery v datech (můžete to přidat jako pohled do své databáze - v mém případě používám pouze běžný tabulkový výraz).
Nyní je spojení těchto „připravených“ sazeb s transakcemi jednoduché a efektivní.
Něco jako:
WITH IndexedExchangeRates AS (
SELECT Row_Number() OVER (ORDER BY Date) ix,
Date,
Rate
FROM ExchangeRates
),
RangedExchangeRates AS (
SELECT CASE WHEN IER.ix=1 THEN CAST('1753-01-01' AS datetime)
ELSE IER.Date
END DateFrom,
COALESCE(IER2.Date, GETDATE()) DateTo,
IER.Rate
FROM IndexedExchangeRates IER
LEFT JOIN IndexedExchangeRates IER2
ON IER.ix = IER2.ix-1
)
SELECT T.Date,
T.Amount,
RER.Rate,
T.Amount/RER.Rate ConvertedAmount
FROM Transactions T
LEFT JOIN RangedExchangeRates RER
ON (T.Date > RER.DateFrom) AND (T.Date <= RER.DateTo)
Poznámky:
-
Můžete nahradit
GETDATE()s datem v daleké budoucnosti, zde předpokládám, že nejsou známy žádné sazby pro budoucnost. -
Pravidlo (B) je implementováno nastavením data prvního známého směnného kurzu na minimální datum podporované SQL Serverem
datetime, což by mělo (podle definice, pokud je to typ, který používáte proDatesloupec) být nejmenší možná hodnota.