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
相关产品推荐
相关产品推荐

