SQL查询报ORA-00979:not a GROUP BY expression错误求修正
ORA-00979 错误根因
Oracle对分组聚合查询有强语法校验,违反以下规则就会触发该错误:
- SELECT子句中出现的所有非聚合字段,必须全部包含在GROUP BY的分组字段列表中
- 不能在GROUP BY分组逻辑中引用SELECT子句里定义的别名
你的SQL触发报错的直接原因:SELECT子句的计算逻辑中使用了非聚合字段WEIGHT_IN_PERCENTAGE,该字段既没有被SUM/COUNT/MAX等聚合函数包裹,也没有被加入GROUP BY分组列表,不符合语法要求。
原始报错信息
ERROR at line 1:
ORA-00979: not a GROUP BY expression
修正方案
因为WEIGHT_IN_PERCENTAGE是作业分类对应的固定权重值,和关联键ASSIGNMENT_CATEGORY(即TYPE_OF_DISTRIBUTION)一一对应,将其加入GROUP BY不会改变原有按学生、学科、作业类型分组的粒度,计算结果和预期完全一致,修正后可直接运行的SQL如下:
SELECT a.STUDENT_NAME, a.SUBJECT, a.TYPE_OF_DISTRIBUTION, SUM(a.POINTS) * d.WEIGHT_IN_PERCENTAGE / (COUNT(a.POINTS) * 100) AS WEIGHTED_SCORE FROM assignments a JOIN distributions d ON a.TYPE_OF_DISTRIBUTION = d.ASSIGNMENT_CATEGORY GROUP BY a.STUDENT_NAME, a.SUBJECT, a.TYPE_OF_DISTRIBUTION, d.WEIGHT_IN_PERCENTAGE ORDER BY a.STUDENT_NAME ASC;
全版本兼容写法
如果不希望调整GROUP BY字段列表,也可以用聚合函数包裹单值属性WEIGHT_IN_PERCENTAGE。由于同一作业分类下权重值唯一,用MAX/MIN函数取值不会改变计算结果,该写法适配所有Oracle版本:
SELECT a.STUDENT_NAME, a.SUBJECT, a.TYPE_OF_DISTRIBUTION, SUM(a.POINTS) * MAX(d.WEIGHT_IN_PERCENTAGE) / (COUNT(a.POINTS) * 100) AS WEIGHTED_SCORE FROM assignments a JOIN distributions d ON a.TYPE_OF_DISTRIBUTION = d.ASSIGNMENT_CATEGORY GROUP BY a.STUDENT_NAME, a.SUBJECT, a.TYPE_OF_DISTRIBUTION ORDER BY a.STUDENT_NAME ASC;
内容的提问来源于stack exchange,提问作者Ramya
相关产品推荐
相关产品推荐

