【问题标题】:Incorrect results with COUNT function?COUNT 函数的结果不正确?
【发布时间】:2012-10-23 10:24:11
【问题描述】:

我是使用 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

希望我已经给了你足够多的帮助,如果我能得到一点帮助,我将不胜感激。多谢你们!

【问题讨论】:

  • “但是,它似乎没有给我正确的输出” - 那是?
  • 请包含对结果如何错误的描述,最好包含用于创建这些结果的每三个表的输入记录?
  • 在示例数据中,您显示了一个没有 GUEST_NO 或 HOTEL_NO 字段的 Booking 表。但是,您在查询中使用了这些字段 - 请问您能解决这个问题吗?

标签: sql oracle count


【解决方案1】:

好吧,你实际上并没有解释为什么你认为你的输出不正确,但有几件事立刻浮现在脑海中。

首先,您需要使用 Booking 表中存储的价格,而不是 Room 表中的价格。为什么?好吧,Room 表中的价格会随着时间而变化,而 Booking 表中的价格是客户实际支付的价格。 编辑 我注意到您的预订表没有存储支付的价格。它也需要!

其次,你说你感兴趣的价格范围是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;

【讨论】:

  • 如果有帮助,我已经添加了更多内容,包括示例数据
【解决方案2】:

这个连接可能是导致它的原因:

AND ROOM.HOTEL_NO = BOOKING.HOTEL_NO

因为酒店有很多房间,所以此连接将为酒店中的每个房间生成一行(或计数 +1)。尝试添加:

AND BOOKING.ROOM_NO = ROOM.ROOM_NO

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    相关资源
    最近更新 更多