【问题标题】:How to group by each day in PL/SQL?如何在 PL/SQL 中按每天分组?
【发布时间】:2012-04-12 12:04:32
【问题描述】:

我正在尝试使用 PL/SQL 获取每天的统计数据。

每天都有几个条目,大量错误:-) 我想按天对它们进行分组。

我现在在做什么:

SELECT TO_CHAR(dateTime, 'DD') DAY, TO_CHAR(dateTime, 'MM') MONTH, errormessage
FROM log
WHERE (...)
GROUP BY MONTH, DAY, errormessage

这会导致 ORA-00904: "DAY": invalid identifier (stops on group by)。

有什么帮助吗? :D

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:
    SELECT TO_CHAR(dateTime, 'DD') DAY, TO_CHAR(dateTime, 'MM') MONTH, errormessage
    FROM log
    WHERE (...)
    GROUP BY TO_CHAR(dateTime, 'DD'), TO_CHAR(dateTime, 'MM'), errormessage
    

    列别名不适用于GROUP BY,您需要完整的表达式。

    【讨论】:

    • 谢谢! 8 分钟内接受:D
    • 很高兴为您提供帮助,您还应该查看@Lukas Eder 的答案,在某些情况下,他的解决方案更便于阅读。
    【解决方案2】:

    您的问题是范围问题。 GROUP BY 子句是语句表表达式的一部分,因此在 SELECT 子句(即投影)之前进行评估。这意味着您的投影别名在分组时不可用。这是一种解决方案

    SELECT DAY, MONTH, errormessage
    FROM (
      SELECT TO_CHAR(dateTime, 'DD') DAY, TO_CHAR(dateTime, 'MM') MONTH, errormessage
      FROM log
      WHERE (...)
    )
    GROUP BY MONTH, DAY, errormessage
    

    这是另一个:

    SELECT TO_CHAR(dateTime, 'DD') DAY, TO_CHAR(dateTime, 'MM') MONTH, errormessage
    FROM log
    WHERE (...)
    GROUP BY TO_CHAR(dateTime, 'MM'), TO_CHAR(dateTime, 'DD'), errormessage
    

    非标准行为

    请注意,某些数据库(包括 MySQL、PostgreSQL 和其他数据库)确实允许从 GROUP BY 子句中的投影中引用列别名。但是,在更严格的 SQL 方言(例如 Oracle)中这是不可能的

    【讨论】:

      【解决方案3】:
      SELECT TO_CHAR(dateTime, 'DD') DAY, TO_CHAR(dateTime, 'MM') MONTH, errormessage
      FROM log
      WHERE (...)
      GROUP by TO_CHAR(dateTime, 'DD'), TO_CHAR(dateTime, 'MM'), errormessage
      

      你不能在 group by 中使用别名

      【讨论】:

        猜你喜欢
        • 2021-07-02
        • 2010-09-24
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        • 2013-06-16
        • 1970-01-01
        • 1970-01-01
        • 2021-04-27
        相关资源
        最近更新 更多