Как выбрать общую стоимость номеров, забронированных одним и тем же человеком

#sql #oracle

#sql #Oracle

Вопрос:

Я создал таблицу:

 Create table rooms
(
roomNo int not null,
hotelNo int not null,
hotelName varchar (40) not null,
roomType varchar (40)
default 'standard' check (roomType in ('single', 'double', 'master', 
'standard', 'president')),
price decimal (8,2) check (price>=0 and price<=99999),
guestNo int null
)
 

roomNo и hotelNo являются первичным ключом и guestNo являются внешним ключом.

Таблица заполняется значениями:

 (101, 123456, 'Home','standard',300, 54321)
(101, 654321, 'Ibis','standard',300, Null)
(101, 987654, 'Hiton','president',15000, null)
(222, 987654, 'Hiton','standard',300, 12345)
(321, 987654, 'Hiton','master',1000, 11111)
(333, 123456, 'Home','single',100, null)
(333, 987654, 'Hiton','standard',300, 12345)
(567, 654321, 'Ibis','standard',300, null)
(888, 654321, 'Ibis','single' ,100, null)
(999, 654321, 'Ibis','double' ,200, null) 
 

Как я могу ответить на вопрос «Выберите общую цену номеров, забронированных одним и тем же человеком».?

Я хочу получить итоговую цену как 600, но на основе этого запроса я получаю 1900:

 select sum(price)
from rooms r inner join guests g
on r.guestNo = g.guestNo and g.guestName = g.guestName
 

Комментарии:

1. Сумма (цена) с этими условиями равна 1900 (300 300 1000 300) Почему вы ожидаете 600? Какую логику вы применили, чтобы дать вам этот ответ?

2. Ответьте на вопрос, гость 12345 бронирует 2 номера, поэтому нужна цена 600

Ответ №1:

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

 select g.guestNo, sum(r.price)
from rooms r inner join guests g
on r.guestNo = g.guestNo
group by g.guestNo
order by g.guestNo;

   GUESTNO SUM(R.PRICE)
---------- ------------
     11111         1000
     12345          600
     54321          300
 

Если вас интересуют только гости с более чем одной записью в номере, вы можете добавить having предложение, чтобы проверить, сколько их было:

 select g.guestNo, sum(r.price)
from rooms r inner join guests g
on r.guestNo = g.guestNo
group by g.guestNo
having count(r.roomNo) > 1
order by g.guestNo;

   GUESTNO SUM(R.PRICE)
---------- ------------
     12345          600
 

Подробнее.

Кстати, ваша модель данных кажется странной; кажется странным записывать конкретного гостя в номер. Возможно, вам следует удалить guestNo это и создать другую таблицу, которая связывает номер с гостем, возможно, для диапазона дат. Цена также может отличаться, поэтому она может потребоваться в этой таблице бронирования или в другой таблице (для учета сезонных цен и т. Д.)?

Комментарии:

1. Спасибо за ваш ответ, я бы это исправил