9

我试图用 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”:无效标识符(在 group by 上停止)。

有什么帮助吗?:D

4

3 回答 3

19
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,您需要完整的表达式。

于 2012-04-12T12:07:14.287 回答
4

您的问题是范围问题。该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)中,这是不可能的

于 2012-04-12T12:07:01.160 回答
2
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 中使用别名

于 2012-04-12T12:07:10.603 回答