2012-10-18 72 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

好的,谢谢你的解释,我试过了,但它仍然给了我相同的结果: –