Du kan först göra en självanslutning på växelkurserna som är ordnade efter datum så att du har start- och slutdatum för varje växelkurs, utan någon överlappning eller lucka i datumen (kanske lägg till det som vy till din databas - i mitt fall använder jag bara ett vanligt tabelluttryck).
Nu är det enkelt och effektivt att förena dessa "förberedda" priser med transaktionerna.
Något i stil med:
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)
Anmärkningar:
-
Du kan ersätta
GETDATE()
med ett datum i en lång framtid, antar jag här att inga priser för framtiden är kända. -
Regel (B) implementeras genom att ställa in datumet för den första kända växelkursen till det minimala datumet som stöds av SQL Server
datetime
, vilket bör (per definition om det är den typ du använder förDate
kolumn) vara det minsta möjliga värdet.