Один запрос с двумя условиями - PullRequest
0 голосов
/ 26 февраля 2011

Использование SQL Server 2005

Выйти из таблицы

ID StartDate EndDate 

001 02/03/2010 02/03/2010
002 02/03/2010 null
…

Таблица событий

ID Date 

001 02/03/2010 
001 02/04/2010 
001 02/05/2010 
002 02/03/2010 
002 02/04/2010 
002 02/05/2010 
….

Все типы данных столбца даты datetime.

У меня есть номер идентификатора.

Я хочу создать столбец состояния, сравнивая дату из таблицы событий с датой окончания из таблицы отпусков.

Условия 1

  • Если в таблице отпуска для определенного идентификатора имеются даты начала и окончания, то она должна отображаться как «отпуск» в таблице событий для конкретной даты

Запрос

Select 
    id, date
    , CASE WHEN t2.id IS NULL THEN null ELSE ‘Leave’ END AS status 
from event table as t1 
left outer join leave table as t2 on 
    t1.id = t2.id and t1.date between t2.startdate and t2.enddate

Условия 2

  • Если дата начала доступна, а дата окончания недоступна в таблице отпусков для определенного идентификатора, то она должна отображаться как «Оставить» в таблице событий на оставшиеся даты

Запрос

 Select 
        id, date, 
        , CASE WHEN t2.id IS NULL THEN null ELSE ‘Leave’ END AS status 
    from event table as t1 
    left outer join leave table as t2 on 
        t1.id = t2.id and t1.date > t2.startdate

Ожидаемый результат

ID Date Status

001 02/03/2010  Leave
001 02/04/2010  
001 02/05/2010 
002 02/03/2010 Leave
002 02/04/2010 Leave
002 02/05/2010 Leave
….

Приведенный выше запрос работает, но я хочу сделать из него один запрос с двумя условиями

Как сделать запрос для вышеуказанного условия.

Нужна помощь по запросу

Ответы [ 3 ]

1 голос
/ 26 февраля 2011

Может быть, это будет работать для вас:

    Select 
    id, date
    , CASE WHEN t2.id IS NULL THEN null ELSE ‘Leave’ END AS status 
from event table as t1 
left outer join leave table as t2 on 
    t1.id = t2.id 
where (t1.date between t2.startdate and t2.enddate)
or (t2.enddate is null and (t1.date > t2.startdate))
0 голосов
/ 26 февраля 2011

Я думаю, что использование условия 'или' с датами может стать проблемой производительности (использование индекса и т. Д.)

может быть, союз (или союз всех) будет работать лучше:

Select 
    id, date
    , CASE WHEN t2.id IS NULL THEN null ELSE ‘Leave’ END AS status 
from event table as t1 
left outer join leave table as t2 on 
    t1.id = t2.id and t1.date between t2.startdate and t2.enddate

Union

Select 
        id, date, 
        , CASE WHEN t2.id IS NULL THEN null ELSE ‘Leave’ END AS status 
    from event table as t1 
    left outer join leave table as t2 on 
        t1.id = t2.id and t1.date > t2.startdate
0 голосов
/ 26 февраля 2011

Попробуй это.Это в основном тот же запрос, если вы используете фиктивную дату окончания в будущем для таблицы отпуска.

Я выбрал 06 июня 2079 года в качестве наибольшего значения smalldatetime, но вы можете изменить его при необходимости

Select 
    id, date
    , CASE WHEN t2.id IS NULL THEN null ELSE ‘Leave’ END AS status 
from
   eventtable as t1 
   left outer join
   leave table as t2 on t1.id = t2.id and
          t1.date between t2.startdate and ISNULL(t2.enddate, '20790606')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...