2015-07-23 4 views
2

У меня возникли проблемы с попыткой обернуть голову тем, как написать этот запрос, чтобы рассчитать уровень заполняемости отеля, а затем перечислить результаты по дате. Рассмотрим следующий тип данных из таблицы называется оговорки:Расчет уровня занятости между диапазоном дат

Arrival  Departure Guest Confirmation 
08/01/2015 08/05/2015 John  13234 
08/01/2015 08/03/2015 Bob  34244 
08/02/2015 08/03/2015 Steve 32423 
08/02/2015 08/02/2015 Mark  32411 
08/02/2015 08/04/2014 Jenny 24422 

Выходные данные будут идеально выглядеть следующим образом:

Date  Occupancy 
08/01/2015 2 
08/02/2015 4 
08/03/2015 2 
08/04/2015 1 
08/02/2015 0 

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

ответ

1

Сначала вы можете создать список дат. В Oracle вы можете сделать это, используя connect by. Это сделает рекурсивный запрос. Например, чтобы получить следующие 30 дней, вы можете выбрать сегодня и продолжить подключение до тех пор, пока не получите желаемое количество дней. level указывает уровень рекурсии.

select trunc(sysdate) + level - 1 as THEDATE 
from dual 
connect by level <= 30; 

в этот список, вы можете запросить количество оговорок на каждый день в этот период:

select THEDATE, 
     (select count(*) 
     from reservations r 
     where r.Arrival >= THEDATE and 
       r.Departure < THEDATE) as RESERVATIONCOUNT 
from 
    (select trunc(sysdate) + level - 1 as THEDATE, 
    from dual 
    connect by level <= 30) 

Вместо того, чтобы получить определенное количество дат, вы можете также получить другое значение там, например, получить не менее 30 дней в будущем, но в дальнейшем, если имеются оговорки для более поздних ...:

select THEDATE, 
     (select count(*) 
     from reservations r 
     where r.Arrival >= THEDATE and 
       r.Departure < THEDATE) as RESERVATIONCOUNT 
from 
    (select trunc(sysdate) + level - 1 as THEDATE, 
    from dual 
    connect by 
     level <= greatest(30, (select trunc(max(DEPARTURE) - sysdate) 
          from reservations))) 
Смежные вопросы