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 proDate
sloupec) být nejmenší možná hodnota.