Хитрый SQL я не могу получить ... Даты и NULL - PullRequest
0 голосов
/ 10 октября 2011

Представьте себе таблицу с некоторыми позициями

LineItemID   CountryID   Date
1             China      6/26/2011
2             China      6/27/2011
3             US         3/21/2011

У меня также есть таблица с некоторыми показателями, поэтому:

CountryID  ExchangeRateDate   ExchangeRateDateTo   Rate
US           1/1/2011               NULL             1
China        6/1/2011               6/13/2011        6.06
China        6/13/2011              6/26/2011        6.13
China        6/26/2011              NULL             6.26

Обратите внимание, что ставка для США не меняет ее простоставка 1 с NULL для ExchangeRateDateTo.Я не могу присоединиться к таблицам по идентификатору страны. Моя проблема, например, заключается в том, как я могу присоединиться не только к идентификатору страны, но и использовать дату FirstTable со вторыми таблицами ExchangeRateDate / To, чтобы получить правильную дату.* Например, я не могу сказать

WHERE FirstTable.[Date] BETWEEN SecondTable.ExchangeRateDate AND SecondTable.ExchangeRateDateTo

Потому что, например, курс Китая становится нулевым (начинается с 26.06.2011 до NULL).
Так что в основном я ищутаким образом, что я получаю результат, например, из Китая по курсу 6.26, потому что даты от 6 / 26-6 / 27.Курс 6,13 закончился прямо 6/26, поэтому он должен забрать новый курс.

Таким образом, мое присоединение будет к countryID плюс использование диапазона дат для выбора правильного курса, в противном случае, если я толькоприсоединяясь к стране, вы можете видеть, что это приведет к декартовой системе.

Ответы [ 2 ]

3 голосов
/ 10 октября 2011

Используйте значение дозорного

WHERE
    FirstTable.[Date] 
                 BETWEEN SecondTable.ExchangeRateDate
                 AND ISNULL(SecondTable.ExchangeRateDateTo, '99991231')

Вы также можете сделать это в JOIN

FROM
    FirstTable F
    JOIN
    SecondTable S ON F.[Date] BETWEEN S.ExchangeRateDate AND ISNULL(S.ExchangeRateDateTo, '99991231')

COALESCE более переносим, ​​но имеет побочные эффекты, связанные с приоритетом типа данных.

Допустимо хранить 9991231 как дату ExchangeRateDateTo: может быть не «правильным», но упрощает код и JOIN.

Редактировать: для обхода неправильных диапазонов используйте не включающее сравнение1011 *

Предполагая, что FromDate является началом диапазона ...

FROM
    FirstTable F
    JOIN
    SecondTable S ON F.[Date] >= S.ExchangeRateDate AND
                     F.[Date] < ISNULL(S.ExchangeRateDateTo, '99991231') 

Измените на > и <=, чтобы сделать его более запутанным, если требуется

0 голосов
/ 10 октября 2011

Для ваших ExchangeRateDateTo сравнений просто используйте:

COALESCE(ExchangeRateDateto, GETDATE())

... который будет проверять либо не NULL дату, либо текущую дату, если поле даты равно NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...