如何在PL / SQL中每天分组?

时间:2012-04-12 12:04:32

标签: sql oracle plsql

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

有任何帮助吗? :d

3 个答案:

答案 0 :(得分:18)

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

答案 1 :(得分: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)虽然不可能,但

答案 2 :(得分: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

你不能在

组中使用别名