2016-10-18 2 views
0

모든 호텔에 대해 예약 된 Hotel_ID, Hotel_Name 및 전체 객실 수를 표시하려고합니다. 그러나 Gold 클래스 고객이 예약하고 구입 한 8 개 이상의 객실이있는 고객 만 표시하면됩니다. 나는 SQL에 아주 새롭다 (하루 전 시작). 그래서 나는 내 실수로 나를 참아 준다.여러 테이블에 걸쳐 SQL 쿼리 결합하기

내가 호텔에서 예약 한 모든 객실이 Gold 등급의 게스트 인 경우 호텔 ID/이름/총 수를 표시합니다.하지만 믹스가있는 경우 (예 : 일부 객실/Gold 클래스는 예약, Silver는 다른 호텔 예약), 그 호텔은 나타나지 않습니다.

(예 : 다양한 예약 ID로 골드 회원이 12 개의 객실을 예약 한 경우 힐튼, [호텔 ID], 12가 표시됩니다. 그러나 Super 8에 골드 멤버가 예약 한 총 10 개의 객실이있는 경우 Silver가 예약 한 또 다른 7 개, 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
Hotel_ID (1,2,3,4 등).
HOTEL_NAME (힐튼 메리어트, 리츠 수퍼 8 등)

ROOMS
Booking_ID (101 등 102, 103, 104)
Hotel_ID (위 참조)
Number_Rooms는 (그러나 많은 룸을 특정 Booking_ID/일 하에서 예약 된 게스트)

BO OKING
Booking_ID (위 참조)
Booking_Date (DD-MM-YY)
Guest_ID (1,2,3,4 등)

손님
Guest_ID (위 참조)
Guest_Name (첫번째 마지막)
클래스 (브론즈, 실버, 골드)

+1

"JOIN'을 실제로 할 필요가있는 것처럼 들리지만, 더 도움이 필요하면 직접 물어보십시오. – uTeisT

답변

0

각 호텔은 "골드"손님 예약 적어도 8 실을 필요로하는 경우, 당신은 단지 다른이 아니라 "골드"예약 (계산하려면 S), 다음 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 
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 

대신 구식 WHERE 절에 조인의 명시 적 JOIN 구문을 사용하십시오.

또한 모델에 개선이 필요해 보입니다. rooms 테이블에 booking_id 열을 포함시키는 이유는 무엇입니까? bookingrooms의 전체 목적은 다소 모호합니다. 이것은 호텔 내에있는 객실을 제시하는 객실 테이블과 호텔 내의 객실 (예약)의 도착 및 출발 시간을 효과적으로 표시하는 예약 테이블을 사용하여 수행 할 수 있습니다.

+0

그게 효과가있다. 감사. 이것에 새로운 것에 대한 사과. 이 모델은 저를 SQL로 소개하는 사람이 작업하기 위해 나에게 주어졌습니다. 나는 그것이 실제로 기능하는 모델보다 가르치는 도구로 더 의미가 있다고 믿습니다. – movieguy88

+0

도움이된다면 [내 답변 수락] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) 수 있습니다. 좋은 습관으로 시작하면 나중에 전체 프로세스를 다시 수행 할 필요가 없음을 기억하십시오. –

관련 문제