2012-10-18 73 views
-1

我有一張有4張桌子的數據庫:預訂,酒店,客人和房間。我試圖讓我的SQL語句(在Oracle中)產生每個酒店的平均房價。這是目前我有:SQL語句的結構不正確?

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; 

從我以爲,這句話將選擇酒店的名稱以及在「Shangra_la」所有的房間平均價格,「希爾頓」和「喜來登」並命令他們酒店的名字,但是當我這樣做時,我得到的每個酒店的平均值是錯的。這是我的輸出:

H_NAME  AVG. R_PRICE 
Hilton  253.5 
Shangra_La 253.5 
Sheraton 253.5 

下面是ROOM表中的數據:

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); 

和酒店:

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

有我構造的說法不正確?我能做些什麼來解決這個問題?希望我已經提供了足夠的信息。

回答

2

您沒有連接條件,因此它採用了roomhotel的叉積。

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

你究竟是什麼意思?你的意思是刪除組並按順序排列,並將其替換爲*? –

2

你需要加入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

我試過這個,但它似乎沒有區別,它可能是在平均選擇語句中的東西? –

+0

「」HOTEL「。」H_NAME「:無效標識符」 –

+0

嘗試我的編輯。你是直接在數據庫上運行這個查詢,還是有一些後期處理?您的結果看起來完全不符合您的查詢(例如,列名稱不同) – StevieG

0

我還沒有測試,但你的第一行應該是這樣的:

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

我想你所有的價格不是 酒店專用 一個平均超過。

0

查詢缺少一個重要信息:hotelroom之間的鏈接。該數據庫不知道H100是一家酒店;你必須告訴。這被稱爲「連接」(因爲你以某種方式加入了兩套)。

添加AND ROOM.R_HOTEL_ID = HOTEL.H_IDWHERE條款(必須使用正確的列名,但你的想法)。

+0

好的,謝謝你的解釋,我試過了,但它仍然給了我相同的結果: –