-1

我有一个有 4 张桌子的数据库:预订、酒店、客人和房间。我试图让我的 SQL 语句(在 Oracle 中)生成每家酒店的平均房价。这是我目前拥有的:

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”、“Hilton”和“Sheraton”中所有房间的酒店名称和平均价格,并按酒店名称排序,但是当我这样做时,我得到了每个酒店的平均值相同,这是错误的。这是我的输出:

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

我的陈述结构是否不正确?我可以做些什么来解决这个问题?希望我提供了足够的信息。

4

4 回答 4

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;

否则,您看到的平均数字将是所有房间和价格的笛卡尔平均值

于 2012-10-18T09:58:59.493 回答
2

您没有连接条件,因此它采用room和的叉积hotel

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;
于 2012-10-18T09:59:46.697 回答
0

我还没有测试过,但你的第一行应该是这样的:

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

我认为您是在对所有价格进行平均,而不是 针对特定酒店的价格 。

于 2012-10-18T10:01:11.770 回答
0

该查询缺少一个重要信息: 和 之间的hotel链接room。数据库不知道那H100是一家酒店;你必须告诉。这称为“加入”(因为您以某种方式加入两组)。

添加AND ROOM.R_HOTEL_ID = HOTEL.H_IDWHERE子句(您必须使用正确的列名,但您明白了)。

于 2012-10-18T10:01:48.710 回答