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örDatekolumn) vara det minsta möjliga värdet.