【问题标题】:ORA-00907: missing right parenthesis using count with expression inside itORA-00907: 使用带有表达式的计数缺少右括号
【发布时间】:2016-11-30 19:16:18
【问题描述】:
SELECT Hotel_Name, COUNT(H_CHECK.Hotel_checkIn >= 'JUL-1-2016' AND H_CHECK.Hotel_checkIn <= 'JUL-31-2016') FROM HOTEL, H_CHECK
GROUP BY Hotel_Name

ORA-00907: 缺少右括号

我尝试了多种方式放置括号,但我找不到解决方案。我正在使用 Oracle Application Express 11G。

这是查询:

显示 2016 年 7 月有超过 2 位客户入住的酒店名称。

【问题讨论】:

  • 没有JOIN条件,怎么回事?

标签: sql oracle oracle11g


【解决方案1】:

一旦你解决了你的直接语法问题,你需要正确的JOIN 语法。

解决问题的一种方法是将条件移至WHERE 子句,从而产生如下查询:

SELECT Hotel_Name, COUNT(hc.hotel_id)
FROM HOTEL h LEFT JOIN
     H_CHECK hc
     ON h.hotel_id = hc.hotel_id  -- I don't know what the right join condition is
WHERE hc.Hotel_checkIn >= DATE '2016-07-01' AND
      hc.Hotel_checkIn <= DATE '2016-07-31'
GROUP BY Hotel_Name;

【讨论】:

    【解决方案2】:

    您不能在 sql 查询的 Select 语句中基于 conditioncount

    COUNT (
                H_CHECK.Hotel_checkIn >= 'JUL-1-2016'
            AND H_CHECK.Hotel_checkIn <= 'JUL-31-2016')
    

    这是错误的。你可以这样做>

        SELECT Hotel_Name,
             COUNT (1)               
        FROM HOTEL
        join H_CHECK
        ON  H_CHECK.Hotel_checkIn >= 'JUL-1-2016'
        AND H_CHECK.Hotel_checkIn <= 'JUL-31-2016'
    GROUP BY Hotel_Name
    having count(1) > 2;
    

    【讨论】:

    • 哦...谢谢...然后我尝试将其放在 GROUP BY Hotel_Name 之后: HAVING COUNT(H_CHECK.Hotel_checkIn >= '30-JUN-2016' AND H_CHECK.Hotel_checkIn 2 我得到 ORA-00907: 再次缺少右括号
    • @XING 你绝对可以做条件计数!
    • @Boneist..我只是遵循了最佳实践.. :-)
    • @XING You cannot count based on condition ...这是不正确的,但与最佳(或最差)实践无关。 OP 在查询中进行条件计数是否有意义是另一回事,但仍有可能这样做。
    • @Boneist..Bt 一旦你告诉我们必须告诉东方和最好的解决方案。我发现将其作为连接很容易理解,这就是建议的原因。你觉得把条件计数更好还是把它作为一个连接..而且当我说You cannot count based on condition我发布了 sql 并且当然使用那个 sql 你不能数。
    【解决方案3】:

    您在计数中的条件中缺少CASE ... END。你追求的是这样的:

    SELECT Hotel_Name,
           COUNT(case when H_CHECK.Hotel_checkIn >= 'JUL-1-2016'
                           AND H_CHECK.Hotel_checkIn <= 'JUL-31-2016'
                           then 1
                 end)
    FROM   HOTEL, H_CHECK
    GROUP BY Hotel_Name;
    

    但是,我对您的查询有一些担忧:

    1. 如果您的 hotel_checkin 列是 DATE 数据类型,那么您应该将其与 DATE 而非字符串进行比较。 IE。 H_CHECK.Hotel_checkIn &gt;= to_date('07-01-2016', 'mm-dd-yyyy') - 这样,您可以避免依赖将字符串隐式转换为日期,这取决于您的 NLS_DATE_FORMAT 参数设置。这可能会被更改,并可能导致您的查询失败。

    2. FROM HOTEL, H_CHECK不要使用旧式的加入方式;而是使用 ANSI 风格的方法:FROM hotel cross join h_check

    3. 您的意思是连接是交叉连接还是忘记添加连接条件?

    4. 您应该为 hotel_name 列添加别名以帮助可维护性。

    5. 您还应该为计数列命名。

    6. 由于您只计算 2016 年 7 月 1 日至 31 日之间签到的行数,因此您应该将此条件移动到 where 子句中(正如 XING 在他们的回答中所显示的那样)*除非*您还需要显示酒店在该时间段内没有任何签到。

    7. 您的条件假定 hotel_checkin 列中没有时间元素 - 即。一切都设置为午夜。但是,如果您可以有一个带时间的日期,请记住,您的计数将忽略所有签入日期为 2016 年 7 月 31 日且在午夜之后的行。在这种情况下,您的上限需要更改为:H_CHECK.Hotel_checkIn &lt; to_date('08-01-2016', 'mm-dd-yyyy')

    【讨论】:

    • 我如何确保它只显示两个日期之间有超过 2 个客户的酒店的名称?
    • @NasrulArif 请参阅 Gordon Linoff 的回答 - 然后,您需要做的就是在 having COUNT(hc.hotel_id) &gt; 2 的行中包含一个 having 子句。
    • 我看到它的效果非常好,就像我需要的那样......谢谢
    猜你喜欢
    • 2018-05-23
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多