У меня есть таблица ExchangeRates, в которой указан код страны и что-то подобное:
ExchangeRateID Country ToUSD ExchangeRateDate
1 Euro .7400 2/14/2011
2 JAP 80.1900 2/14/2011
3 Euro .7700 7/20/2011
Обратите внимание, что может существовать одна и та же страна с другим курсом, основанным на дате ... так, например, выше, евро было 2,74 на 2/14/2011, а сейчас составляет 0,77700 7/20/2011.
У меня есть еще одна таблица позиций для перечисления элементов в зависимости от страны. В этой таблице каждая позиция имеет дату, связанную с ней. Дата позиции должна использовать соответствующую дату и страну на основе обменного курса. Таким образом, используя вышеуказанные данные, если у меня была позиция со страной Евро от 16.02.2011, следует использовать значение евро для 14.02.2011, а не значение для 20.07.2011 из-за даты (условие er. ExchangeRateDate <= erli.LineItemDate). Это сработало бы, если бы у меня был только один элемент в таблице, но представьте, что у меня была дата элемента строки 01.08.2011, тогда это условие (er.ExchangeRateDate <= erliLineItemDate) вернуло бы несколько строк, следовательно, мой запрос не удался ... </p>
SELECT
er.ExchangeRateID,
er.CountryID AS Expr1,
er.ExchangeRateDate,
er.ToUSD,
erli.ExpenseReportLineItemID,
erli.ExpenseReportID,
erli.LineItemDate
FROM
dbo.ExpenseReportLineItem AS erli
LEFT JOIN
dbo.ExchangeRate AS er
ON er.CountryID = erli.CountryID
AND DATEADD(d, DATEDIFF(d, 0, er.ExchangeRateDate), 0) <= DATEADD(d, DATEDIFF(d, 0,
erli.LineItemDate), 0)
WHERE (erli.ExpenseReportID = 196)
Проблема с этим левым соединением ... заключается в том, что даты <= дата позиции, поэтому она возвращает много записей, я должен был бы как-то это сделать, но не знаю как. </p>
Таблицы LineItem имеют несколько записей, и каждая запись может иметь свой собственный CountryID:
Item Country ParentID LineItemDate
Line Item 1 Euro 1 2/14/2011
Line Item 2 US 1 2/14/2011
Line Item3 Euro 1 2/15/2011
Итак, есть три записи для ParentID (ExpenseReportID) = 1. Итак, я беру эти записи и присоединяюсь к таблице ExchangeRate, где страна в моей таблице позиций = страна таблицы обменного курса (эта часть проста), НО Второе условие, которое я должен выполнить:
AND DATEADD(d, DATEDIFF(d, 0, er.ExchangeRateDate), 0) <= DATEADD(d, DATEDIFF(d, 0,
erli.LineItemDate), 0)
Но вот в чем проблема, потому что она вернет несколько строк из моей таблицы обменных курсов, потому что евро указан дважды.