#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. Спасибо за ваш ответ, я бы это исправил