簡體   English   中英

跨多個表組合SQL查詢

[英]Combining SQL Query Across Multiple Tables

我想列出所有酒店的Hotel_ID,Hotel_Name和預訂的客房總數。 但是,我只需要顯示那些金級客戶預訂和購買的房間超過8個的房間。 我是SQL的新手(大約從一天前開始),所以請允許我接受我的錯誤。

這是我一直在嘗試的事情,如果為該酒店預訂的所有客房都是由金級客人預訂的,但如果有混合使用(例如,某些客房/預訂是由金牌預訂的,則將顯示酒店ID /名稱/總數)金級,其他由銀級),則該酒店將不會顯示。

(例如,如果希爾頓總共預訂了12間客房,所有金卡會員都使用不同的預訂ID預訂,那么它將顯示希爾頓[酒店ID]12。但是如果速8酒店總共預訂了10間金卡會員預訂的房間,另外7間由Silver預定,然后應該顯示Super 8,[Hotel_ID],10-我現在的樣子,Hilton可以使用,但是Super 8示例根本不會顯示)。

SELECT hotel.hotel_id, hotel.hotel_name, SUM(rooms.number_rooms) AS total_rooms_booked
FROM hotel, rooms
WHERE hotel.hotel_id=rooms.hotel_id
HAVING SUM(rooms.number_rooms) > 8
GROUP BY hotel.hotel_id, hotel.hotel_name
INTERSECT
SELECT hotel.hotel_id, hotel.hotel_name, SUM(rooms.number_rooms) AS total_rooms_booked
FROM hotel, rooms, booking, guests
WHERE hotel.hotel_id=rooms.hotel_id AND rooms.booking_id=booking.booking_id
AND booking.guest_id=guests.guest_id AND class='gold'
GROUP BY hotel.hotel_id, hotel.hotel_name
;

這是表格的設置方式。

飯店
Hotel_ID(1、2、3、4等)
Hotel_Name(希爾頓,萬豪,麗思,速8等)

客房
Booking_ID(101、102、103、104等)
Hotel_ID(見上文)
Number_Rooms(但是,客人根據特定的Booking_ID / Date預訂了許多房間)

預訂
Booking_ID(見上文)
Booking_Date(DD-MM-YY)
Guest_ID(1、2、3、4等)

來賓
Guest_ID(請參見上文)
Guest_Name(第一個)
類(銅,銀,金)

如果每個酒店至少需要由“金牌”客人預訂的8個房間,並且您只想計算“金牌”的預訂(而不是其他),那么下面的JOIN就是您所需要的:

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

您的預期輸出令人困惑,因為您提到預訂的房間總數還計入非金卡會員預訂的客房,但是在輸出中再次提到,該計數只應涉及金卡會員的預訂。 我假設是后者:

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的整個目的似乎有點含糊。 這可以通過顯示酒店內現有客房的房間表和預訂表來完成,預訂表將有效地標記客人在酒店內房間的到達和離開時間(預訂)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM