如何在 PL/SQL 中按每天分组?
Posted
技术标签:
【中文标题】如何在 PL/SQL 中按每天分组?【英文标题】:How to group by each day in 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
【问题讨论】:
【参考方案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 中使用别名
【讨论】:
以上是关于如何在 PL/SQL 中按每天分组?的主要内容,如果未能解决你的问题,请参考以下文章