【问题标题】: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() 与数据中的列同名。

标签: sql oracle sql-order-by aggregate-functions


【解决方案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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-13
        相关资源
        最近更新 更多