ORA-00937非单分组组函数报错(已用GROUP BY)原因排查
ORA-00937错误原因及修复方案
错误根因
你触发错误的核心原因是聚合函数的作用范围和GROUP BY的位置不匹配:
- 你写的GROUP BY子句只作用于内层的
port1子查询,和外层主查询无关 - 外层主查询的SELECT列表中同时出现了非聚合字段
po.plop_sq_planej_oper、port.rtsi_cd_rtsubitem和聚合函数count(*),但没有给外层查询加对应的GROUP BY子句,不符合Oracle的SQL语法规范:只要查询中使用了聚合函数,所有未包裹在聚合函数内的查询字段,都必须放到GROUP BY子句中。
官方报错提示的第1行第8列刚好对应主查询SELECT后的首个字段位置,也印证了是外层查询的语法问题。
修复方案
如果你是要按plop_sq_planej_oper和rtsi_cd_rtsubitem分组统计符合条件的记录数,只需要在外层查询的WHERE条件末尾加上对应的GROUP BY即可,修改后的SQL如下:
select po.plop_sq_planej_oper, port.rtsi_cd_rtsubitem, (count(*)-1) as qnt_lista from sigiop.planejamento_operacional po, sigiop.planejamento_operacional_rt port, sigiop.rt_subitem rtsi, (select po1.plop_sq_planej_oper, po1.plop_dt_criacao, rtsi1.rtit_cd_rtitem from sigiop.planejamento_operacional po1, sigiop.planejamento_operacional_rt port1, sigiop.rt_subitem rtsi1 where po1.plop_sq_planej_oper = port1.plop_sq_planej_oper and port1.rtsi_cd_rtsubitem = rtsi1.rtsi_cd_rtsubitem group by po1.plop_sq_planej_oper, po1.plop_dt_criacao, rtsi1.rtit_cd_rtitem) port1 where po.plop_sq_planej_oper = port.plop_sq_planej_oper and port.rtsi_cd_rtsubitem = rtsi.rtsi_cd_rtsubitem and po.plop_dt_criacao >= port1.plop_dt_criacao(+) and rtsi.rtit_cd_rtitem = port1.rtit_cd_rtitem(+) -- 新增外层GROUP BY group by po.plop_sq_planej_oper, port.rtsi_cd_rtsubitem
内容的提问来源于stack exchange,提问作者AllPower
相关产品推荐
相关产品推荐

