2012-10-18 2 views
-1

나는 예약, 호텔, 손님 및 방과 같이 4 개의 테이블이있는 DB를 가지고 있습니다. 각 호텔의 평균 객실 가격을 산출하는 SQL 문 (Oracle에서)을 얻으려고합니다. 이것은 내가 무엇을 현재 :SQL 문 구조가 잘못 되었습니까?

나는, 호텔의 이름과 'Shangra_la'의 모든 객실의 평균 가격을 선택 것이다 문, '힐튼'와 '쉐라톤'을 어떻게 생각에서
SELECT HOTEL.H_NAME "HOTEL NAME", ROUND(AVG (R_PRICE), 1) "AVERAGE ROOM PRICE" 
FROM ROOM, HOTEL 
WHERE HOTEL.H_NAME = 'Shangra_La' 
OR HOTEL.H_NAME = 'Hilton' 
OR HOTEL.H_NAME = 'Sheraton' 
GROUP BY HOTEL.H_NAME 
ORDER BY HOTEL.H_NAME; 

주문을하여 호텔의 이름 그러나 내가 이것을 할 때, 나는 틀린 각 호텔에 대해 같은 평균을 얻는다. 다음은

H_NAME  AVG. R_PRICE 
Hilton  253.5 
Shangra_La 253.5 
Sheraton 253.5 

룸의 테이블 데이터입니다 : 이것은 내 출력

insert into room values 
('1','H100','S',220.00); 
insert into room values 
('2','H100','D',230.00); 
insert into room values 
('3','H100','F',310.00); 
insert into room values 
('1','H200','S',260.00); 
insert into room values 
('2','H200','D',170.00); 
insert into room values 
('3','H200','S',250.00); 
insert into room values 
('4','H200','F',180.00); 
insert into room values 
('5','H200','F',295.00); 
insert into room values 
('1','H300','D',200.00); 
insert into room values 
('2','H300','S',420.00); 

AND HOTEL :

insert into hotel values 
('H100','Sheraton','Melbourne'); 
insert into hotel values 
('H200','Shangra_La','Sydney'); 
insert into hotel values 
('H300','Hilton', 'Perth'); 

내가 잘못 문을 구성 했습니까? 이 문제를 해결하려면 어떻게해야합니까? 잘만되면 나는 충분한 정보를 제공했다.

답변

2

가입 조건이 없으므로 roomhotel의 십자가를 사용합니다. 모든 가격이 아닌 호텔 별 하나를 평균화하는 I 생각

HOTEL.H_NAME "HOTEL NAME", ROUND(AVG (HOTEL.R_PRICE), 1) 

: 나는를 havent

SELECT HOTEL.H_NAME "HOTEL NAME", ROUND(AVG (R_PRICE), 1) "AVERAGE ROOM PRICE" 
FROM ROOM JOIN HOTEL ON HOTEL.HOTEL_NO = ROOM.HOTEL_NO 
WHERE HOTEL.H_NAME = 'Shangra_La' 
OR HOTEL.H_NAME = 'Hilton' 
OR HOTEL.H_NAME = 'Sheraton' 
GROUP BY HOTEL.H_NAME 
ORDER BY HOTEL.H_NAME; 
+0

내가 HOTEL.HOTEL_NO = ROOM.HOTEL_NO을 사용하여이 방법을 시도해도 여전히 다른 어떤 아이디어와 동일한 결과를 얻을 수 있습니까? –

+0

'GROUP BY'와'ORDER BY'없이'SELECT *'를하면 어떤 결과를 얻을 수 있습니까? –

+0

정확히 무엇을 의미합니까? 그룹 별 주문을 삭제하고 *로 대체하십시오.'룸이 HOTEL.HOTEL_NO = ROOM.HOTEL_NO WHERE HOTEL.H_NAME = 'Shangra_La' 또는 HOTEL.H_NAME = '힐튼' 또는 HOTEL.H_NAME = ON HOTEL 가입하세요 * FROM 를 선택 –

2

당신은 함께 두 테이블을 조인해야합니다

SELECT HOTEL.H_NAME "HOTEL NAME", ROUND(AVG (R_PRICE), 1) "AVERAGE ROOM PRICE" 
FROM ROOM, HOTEL 
WHERE HOTEL.H_NAME = 'Shangra_La' 
OR HOTEL.H_NAME = 'Hilton' 
OR HOTEL.H_NAME = 'Sheraton' 
AND HOTEL.R_NUM = ROOM.R_NUM -- Here (guessing at your column names) 
GROUP BY HOTEL.H_NAME 
ORDER BY HOTEL.H_NAME; 

이 편집 :

SELECT H.H_NAME "HOTEL NAME", ROUND(AVG (R.R_PRICE), 1) "AVERAGE ROOM PRICE" 
FROM ROOM R INNER JOIN HOTEL H ON R.HOTEL_NO = H.HOTEL_NO 
WHERE H.H_NAME = 'Shangra_La' 
OR H.H_NAME = 'Hilton' 
OR H.H_NAME = 'Sheraton' 
GROUP BY H.H_NAME 
ORDER BY H.H_NAME; 

그렇지 않으면 당신이 볼 수있는 평균은 모든 객실의 데카르트의 평균 될 것 & 가격

+0

나는 이것을 시도했지만 차이를 만드는 것처럼 보이지 않는다. 평균적인 select 명령문에 뭔가있을 수 있을까? –

+0

""HOTEL "."H_NAME ": 식별자가 올바르지 않습니다." –

+0

내 편집을 시도하십시오. 이 쿼리를 데이터베이스에서 직접 실행하고 있습니까? 아니면 일부 후 처리가 있습니까? 결과가 검색어와 전혀 일치하지 않는 것 같습니다 (예 : 열 이름이 다릅니다) – StevieG

0

는하지만 첫 번째 줄 이런 식으로 뭔가를 읽어야 테스트했다.

0

쿼리에 중요한 정보가 누락되었습니다. hotelroom 사이의 연결입니다. 데이터베이스에서 H100이 호텔임을 알 수 없습니다. 너는 말해야 해. 이를 "조인"이라고합니다 (두 세트를 특정 방식으로 조인하기 때문에).

WHERE 절에 AND ROOM.R_HOTEL_ID = HOTEL.H_ID을 추가하십시오 (올바른 열 이름을 사용해야하지만 아이디어를 얻을 수 있습니다).

+0

설명 해 주셔서 감사합니다. 그러나 이것을 시도했지만 여전히 동일한 결과를 제공합니다. –

관련 문제