You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle SQL查询报错ORA-00979:每月注册学生数统计求助

修正ORA-00979错误的SQL查询方案

问题根源是:SELECT子句中的registrationdate列既不在GROUP BY子句中,也未被聚合函数包裹,违反了Oracle的GROUP BY规则——SELECT里的非聚合列必须全部出现在GROUP BY中。

基础修正方案

直接在SELECT中使用与GROUP BY一致的日期格式化表达式作为月份列,确保SELECT与GROUP BY的分组维度匹配:

SELECT To_Char(registrationdate, 'Month') AS "REGDATE", COUNT(*) AS "NUMSTUDENTS"
  FROM registration r
  INNER JOIN students s
  ON r.studentid = s.studentid
  GROUP BY To_Char(registrationdate, 'Month')
  ORDER BY NUMSTUDENTS;

优化显示与排序的进阶方案

如果希望月份名称无多余空格(Month格式会返回带空格的名称,如January ),且按自然月份顺序排序(而非学生数或字母序),可调整为:

SELECT To_Char(registrationdate, 'TMMonth') AS "REGDATE", COUNT(*) AS "NUMSTUDENTS"
  FROM registration r
  INNER JOIN students s
  ON r.studentid = s.studentid
  GROUP BY To_Char(registrationdate, 'TMMonth'), EXTRACT(MONTH FROM registrationdate)
  ORDER BY EXTRACT(MONTH FROM registrationdate);

这里TMMonth会返回无空格的月份名称(如January),同时通过EXTRACT(MONTH...)保证排序是1月到12月的自然顺序。

简化代码的方案(Oracle 12c及以上支持)

Oracle 12c及更高版本允许在GROUP BY中直接使用SELECT子句的列别名,让代码更简洁:

SELECT To_Char(registrationdate, 'TMMonth') AS "REGDATE", COUNT(*) AS "NUMSTUDENTS"
  FROM registration r
  INNER JOIN students s
  ON r.studentid = s.studentid
  GROUP BY "REGDATE", EXTRACT(MONTH FROM registrationdate)
  ORDER BY EXTRACT(MONTH FROM registrationdate);

内容的提问来源于stack exchange,提问作者Alex Admant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 23:24:40