如何修复此查询?
Posted
技术标签:
【中文标题】如何修复此查询?【英文标题】:How to fix this query? 【发布时间】:2021-03-12 05:36:45 【问题描述】:我正在尝试选择过去一周中每一天的待处理票证。我有此查询并收到此错误:ORA-00935: 组函数嵌套太深
SELECT TO_CHAR(UPDATED_AT, 'day') AS WEEK_DAY, COUNT(ID) AS UPDATED_AT
FROM freshdesk_api
WHERE UPDATED_AT >= TRUNC(SYSDATE, 'iw')
AND UPDATED_AT < TRUNC(SYSDATE, 'iw') + 7
AND STATUS IN (3)
GROUP BY TO_CHAR(UPDATED_AT, 'day')
ORDER BY MIN(UPDATED_AT)
【问题讨论】:
我在这里看不到任何问题。但是,如果您从查询中删除ORDER BY MIN(UPDATED_AT)
,您能分享一下结果吗?
是的,这似乎是问题
问题是调用COUNT()
与数据中的列同名。
【参考方案1】:
问题在于 order by 子句。我不确定您为什么使用MIN(UPDATED_AT)
,但请查看它以解决您的问题。如果您希望按升序排序,请使用
ORDER BY UPDATED_AT ASC
【讨论】:
【参考方案2】:如评论和其他答案中所述,您面临ORDER BY
的问题。
尝试使用以下技术对周一到周五的结果进行排序。
SELECT TO_CHAR(UPDATED_AT, 'day') AS WEEK_DAY,
COUNT(ID) AS UPDATED_AT,
MIN(UPDATED_AT) AS M_UPDATE_DATE -- ADDED THIS AND GAVE IT ALIAS
FROM freshdesk_api
WHERE UPDATED_AT >= TRUNC(SYSDATE, 'iw')
AND UPDATED_AT < TRUNC(SYSDATE, 'iw') + 7
AND STATUS IN (3)
GROUP BY TO_CHAR(UPDATED_AT, 'day')
ORDER BY M_UPDATE_DATE; -- USED ALIAS NAME HERE
【讨论】:
【参考方案3】:大概,您希望按星期几而不是按每天的行数对行进行排序。
但是,您将 COUNT()
与日期列同名,这会导致歧义。使用不同的别名 - UPDATED_AT
无论如何对于计数都没有意义:
SELECT TO_CHAR(UPDATED_AT, 'day') AS WEEK_DAY, COUNT(*) AS CNT --> here
FROM freshdesk_api
WHERE UPDATED_AT >= TRUNC(SYSDATE, 'iw')
AND UPDATED_AT < TRUNC(SYSDATE, 'iw') + 7
AND STATUS = 3
GROUP BY TO_CHAR(UPDATED_AT, 'day')
ORDER BY MIN(UPDATED_AT)
或者,如果您真的想要结果集中的特定别名,请在 MIN()
中的列名前加上表名(或别名)以消除歧义:
SELECT TO_CHAR(UPDATED_AT, 'day') AS WEEK_DAY, COUNT(*) AS UPDATED_AT
FROM freshdesk_api f --> table alias
WHERE UPDATED_AT >= TRUNC(SYSDATE, 'iw')
AND UPDATED_AT < TRUNC(SYSDATE, 'iw') + 7
AND STATUS = 3
GROUP BY TO_CHAR(UPDATED_AT, 'day')
ORDER BY MIN(f.UPDATED_AT) --> prefixed column name
注意事项:
假设id
不可为空,count(*)
等价于count(id)
,效率更高
STATUS IN (3)
措辞更简单STATUS = 3
【讨论】:
以上是关于如何修复此查询?的主要内容,如果未能解决你的问题,请参考以下文章