跨多个表组合SQL查询

时间:2016-10-18 21:33:35

标签: sql oracle oracle-sqldeveloper

我希望列出所有酒店预订的Hotel_ID,Hotel_Name和客房总数。但是,我只需要向金级客户预订和购买超过8间客房的人展示。我是SQL的新手(大约一天前开始),所以请在我的错误中忍受我。

以下是我一直在尝试的内容,如果酒店预订的所有客房均为金级客人,则会显示酒店ID /姓名/总数,但如果有混合(例如某些客房/预订)由Gold等级预订,其他人由Silver预订,然后该酒店将不会出现。

(例如,如果希尔顿总共预订了12间客房,则所有金卡会员均可根据不同的预订ID进行预订。 s,它将显示希尔顿,[酒店ID],12。但如果Super 8共有10间客房由Gold会员预订,另外7间由Silver预订,那么它应该显示Super 8,[Hotel_ID],10 - The way我现在拥有它,希尔顿会工作,但Super 8的例子根本不会出现。

X-

以下是表格的设置方法。

HOTEL
Hotel_ID(1,2,3,4等)
Hotel_Name(希尔顿,万豪,丽兹,速8等)

房间信息
Booking_ID(101,102,103,104等)
Hotel_ID(见上文)
Number_Rooms(但是客人在特定的Booking_ID /日期下预订了许多房间)

BOOKING
Booking_ID(见上文)
Booking_Date(DD-MM-YY)
Guest_ID(1,2,3,4等)

客人
Guest_ID(见上文)
Guest_Name(最后一个)
类(青铜,银,金)

2 个答案:

答案 0 :(得分:0)

如果每家酒店需要至少8间由“金”客人预订的客房,并且您只想计算“黄金”预订(不是任何其他),那么下面的SELECT hotel.hotel_id, hotel.hotel_name, SUM(Rooms.Number_Rooms) AS total_rooms_booked FROM hotel INNER JOIN rooms ON hotel.hotel_id=rooms.hotel_id INNER JOIN bookings on rooms.booking_id = bookings.booking_id INNER JOIN guests on bookings.guest_id = guests.guest_id AND guests.class = 'Gold' GROUP BY hotel.hotel_id, hotel.hotel_name HAVING SUM(Rooms.Number_Rooms) > 8 ORDER BY hotel.hotel_id, hotel.hotel_name 就是您所需要的:< / p>

{{1}}

答案 1 :(得分:0)

您的预期输出令人困惑,因为您提到预订的客房总数还包括非黄金会员预订的客房,但您在提及的产品中再次提到计数应仅涉及金卡会员的预订。我假设后者:

select
  h.hotel_id,
  h.hotel_name,
  sum(r.number_rooms) AS total_rooms_booked
from hotel h
join rooms r on h.hotel_id = r.hotel_id
join booking b on b.booking_id = r.booking_id
join guests g on g.guest_id = b.guest_id
where 
  g.class = 'gold'
group by
  h.hotel_id, h.hotel_name
having
  sum(r.number_rooms) > 8

请使用明确的JOIN语法,而不是WHERE子句中的旧式连接。

此外,您的模型似乎需要改进。为什么要在booking_id表中包含rooms列? bookingrooms的整个目的似乎有些模糊。这可以通过房间桌子来展示酒店内的房间和预订表,这将有效地标记您的客人(预订)酒店内客房的到达和离开时间。