Создайте процедуру PL / SQL, которая рассчитывает общий ежемесячный доход.Всего должно быть напечатано по месяцам - PullRequest
0 голосов
/ 01 декабря 2018

Напишите процедуру, которая рассчитывает и отображает общий доход из всех источников всех отелей.Итоги должны быть напечатаны по месяцам, а также за каждый месяц по событию и типу услуги.Включите скидки. (10% скидка, если дата бронирования за 2 месяца до даты начала бронирования).

Таблицы:

Отель Стол имеет:

Hotel_id, hotel_name, Hotel_city, Hotel_state, Hotel_zip,Hotel_phone

Бронирование Стол имеет:

Reservation_id, Hotel_id, Room_num, Service_id, Guest_name, Reservation_date, Reservation_start_date, Reservation_end_date, cancelation_date, Num_of_guest, event_type

Комната Стол имеет:

Room_num, Hotel_id, Room_type, Room_capacity, Room_cost

Сервис Стол имеет:

service_id, Service_type, Service_cost

Это то, что я пытался, но яхотите написать это в форме процедуры;как я это сделал?Пожалуйста помоги.Спасибо

select month (Reservation_end_date) as , event_type,
sum(case when days>= 2 then cost- (cost/100)* 10
else cost) as total_cost)



((select distinct reservation.hotel_id,reservation_date, reservation_start_date,
reservation_end_date, event_type, room.room_type as R_type ,room_cost as R_cost,
months_between(reservation_start_date,reservation_date)as months
from reservation, room
where reservation.hotel_id = room.hotel_id;)

union

 (select hotel_name, reservation_date, reservation_start_date,
reservation_end_date, event_type, services_type, services_cost as cost,
months_between(reservation_start_date,reservation_date)as month
from reservation,service, hotel
where reservation.services_id = service.services_id 
and reservation.hotel_id = hotel.hotel_id;))

group by month(reservation_end_date),event_type;

1 Ответ

0 голосов
/ 02 декабря 2018

Первый шаг - правильно настроить базовый запрос.

Чтобы объединить набор дат в общий месяц, используйте trunc(date_col, 'mm').Предположительно, стоимость номера и стоимость обслуживания должны быть рассчитаны за ночь.Чтобы рассчитать количество ночей, просто вычтите дату начала из даты окончания.

Этот запрос должен дать правильный результат (указанные вами бизнес-правила являются неполными, поэтому трудно быть уверенными).Как и ваш опубликованный код, у него есть подзапросы для расчета стоимости каждого бронирования номера и каждого бронирования услуги.Они агрегируются во внешнем запросе:

select to_char(r_month, 'YYYY-MON') as rpt_month
       , event_type
       , service_type
       , sum ( (r_cost - r_discount ) * no_of_nights ) as tot_cost
from (      
    select trunc(r.reservation_end_date , 'mm') as r_month
           , r.event_type
           , cast(null as varchar2(10)) as service_type
           , rm.room_cost as r_cost
           , case when months_between (r.reservation_start_date, r.reservation_date) >= 2
              then rm.room_cost * 0.1 
              else 0 end as r_discount 
            , (r.reservation_end_date - r.reservation_start_date ) as no_of_nights
    from  reservation r
          join room rm
              on ( r.room_num = rm.room_num  
              and r.hotel_id = rm.hotel_id )
    union all
    select trunc(r.reservation_end_date , 'mon') as r_month
           , r.event_type
           , sv.service_type
           , sv.service_cost  as r_cost
           , case when months_between (r.reservation_start_date, r.reservation_date) >= 2
              then sv.service_cost * 0.1 
              else 0 end as r_discount 
           , (r.reservation_end_date - r.reservation_start_date ) as no_of_nights
    from  reservation r
          join service sv
              on ( r.service_id = sv.service_id )
    )  
group by r_month
       , event_type
       , service_type
order by r_month
       , event_type
       , service_type      
;

Второй шаг заключается в процедуре.Опять же, ваши требования нечетки: должна ли процедура принимать какие-либо параметры?в каком формате должен быть вывод?Поскольку бизнес-сфера (бронирование гостиниц) и формат вопроса ( "напишите процедуру, которая ..." ), это, кажется, домашнее задание, поэтому здесь представлена ​​простейшая интерпретация отображения .Он использует подпрограммы dbms_output для печати на экране, а rpad() и lpad() для создания удобного макета (очевидно, интервалы могут быть не очень удобными, поскольку вы не указали типы данных для различных столбцов).

create or replace procedure display_monthly_reservations as
begin
    << heading >>
    dbms_output.put(rpad('MONTH', 8)); 
    dbms_output.put( rpad('EVENT_TYPE' , 20 ) || ' ');  
    dbms_output.put( rpad('SERVICE_TYPE', 20 ) || ' ');  
    dbms_output.put_line('TOTAL_COST'); 

    << per_line >>
    for r in (
         << insert the query here >> 
    ) loop
        dbms_output.put(r.rpt_month || ' '); 
        dbms_output.put( rpad(r.event_type , 20 ) || ' ');  
        dbms_output.put( rpad(r.service_type , 20 ) || ' ');  
        dbms_output.put_line( lpad(to_char(r.tot_cost , '9999999.99'), 10 ) );   
    end loop per_line;

end display_monthly_reservations;
/ 
...