我是使用ORACLE的SQL的初学者,并遇到了一些问题。我有一个基本数据库,有4个表(HOTEL,ROOM,BOOKING,GUEST),其中填充了有关房间价格的数据。
我有一个书面查询,应该找到预订房间的客人的数量和名称,价格范围在230到350美元之间。还会显示他们预订这些房间的次数。但是,它似乎没有给我正确的输出,我无法弄清楚为什么。这是查询:
SELECT GUEST.GUEST_NAME "GUEST NAME",GUEST.GUEST_NO "GUEST NUMBER",
COUNT(GUEST.GUEST_NO) "NUMBER OF TIMES BOOKED"
FROM ROOM, GUEST, BOOKING
WHERE R_PRICE>=260
AND R_PRICE<=350
AND GUEST.GUEST_NO = BOOKING.GUEST_NO
AND ROOM.HOTEL_NO = BOOKING.HOTEL_NO
GROUP BY GUEST.GUEST_NO, GUEST.GUEST_NAME
ORDER BY "NUMBER OF TIMES BOOKED" ASC;
输出:
Tina Duncan G001 2
Jenny Freeman G003 2
Martin Ferguson G006 3
Paul Happy G002 3
Steve Kirkwood G005 3
以下是表格示例:
房间:
ROOM_NO HOTEL_NO R_TYPE
------- -------- ------ ---------
1 H100 S 220
2 H100 D 230
3 H100 F 310
1 H200 S 260
2 H200 D 170
3 H200 S 250
4 H200 F 180
5 H200 F 295
1 H300 D 200
2 H300 S 420
预订:
DATE_FROM DATE_TO ROOM_NO
--------- --------- -------
15-AUG-12 17-AUG-12 1
30-AUG-12 15-SEP-12 2
01-AUG-12 02-AUG-12 2
10-AUG-12 11-AUG-12 2
01-SEP-12 15-SEP-12 3
31-JUL-12 02-AUG-12 1
11-JUL-12 01-AUG-12 1
12-JUL-12 13-JUL-12 1
14-JUL-12 15-JUL-12 1
17-AUG-12 28-AUG-12 2
31-JUL-12 01-SEP-12 1
31-AUG-12 01-SEP-12 2
31-AUG-12 15-SEP-12 4
01-SEP-12 15-SEP-12 1
游客:
GUEST_NO G_NAME
-------- --------------------
G001 Tina Duncan
G002 Paul Happy
G003 Jenny Freeman
G012 Dianne Kelly
G005 Steve Kirkwood
G006 Martin Ferguson
G007 Vanessa Horton
Goo8 Bianca Begg
输出应为:
Paul Happy G002 2
Jenny Freeman G003 1
Steve Kirkwood G005 1
Martin Ferguson G006 1
Dianne Kelly G012 1
希望我已经给了你足够的,如果我能得到一些帮助,我会很感激。多谢你们!
答案 0 :(得分:1)
嗯,你还没有真正解释为什么你认为你的输出是不正确的,但有些事情会立即浮现在脑海中。
首先,您需要使用预订表中存储的价格,而不是房间表中的价格。为什么?那么,房间表中的价格会随着时间的推移而变化,而预订表中的价格是客户实际支付的价格。 编辑我注意到您的预订表并未存储已支付的价格。它也需要!!
其次,您说明您感兴趣的价格范围是230 - 350美元,但查询是260 - 350美元。
第三,如果您想计算预订数量,请计算预订数量。你在计算客人ID。
我会建议类似以下查询的内容:
SELECT GUEST.GUEST_NAME "GUEST NAME",
GUEST.GUEST_NO "GUEST NUMBER",
COUNT(BOOKING.BOOKINGID) "NUMBER OF TIMES BOOKED"
FROM BOOKING JOIN
GUEST ON GUEST.GUEST_NO = BOOKING.GUEST_NO
WHERE BOOKING.PRICE BETWEEN 230 AND 350
GROUP BY GUEST.GUEST_NO, GUEST.GUEST_NAME
ORDER BY "NUMBER OF TIMES BOOKED" ASC;
答案 1 :(得分:0)
这种联接可能导致它:
AND ROOM.HOTEL_NO = BOOKING.HOTEL_NO
因为酒店有很多房间,所以这个连接会为酒店的每个房间产生一排(或计数+1)。尝试添加:
AND BOOKING.ROOM_NO = ROOM.ROOM_NO