执行SQL查询触发ORA-00937:not a single-group group function报错求助
ORA-00937报错原因分析
ORA-00937: "not a single-group group function" 错误本质是聚合函数的使用和GROUP BY子句的逻辑不匹配。
你的SQL出现这个问题的核心原因:
- 你在SELECT子句中同时使用了嵌套聚合函数
avg(count(*))和分组维度字段to_char(c.datcre, 'YYYY-MM-DD'),二者逻辑冲突 count(*)会按照你GROUP BY指定的日期维度,统计出每天的符合条件的记录数,每个日期对应唯一的count值- 外层的
avg()是要对所有日期的count值求整体平均值,这个平均值是整个查询周期的唯一结果,不存在和单个日期的对应关系,所以Oracle无法执行这种既返回单日期维度又返回全周期聚合值的分组逻辑
解决思路
根据你的实际业务需求,有两种常见解决方案:
方案1:查询全周期的日均记录数(仅返回一个平均值结果)
如果你的需求是统计2020-11-01到2021-11-30这段时间的日均有效记录数,不需要返回每天的维度,修改SQL如下:
SELECT avg(daily_count) as value, 'Taux remplissage' as serie FROM ( SELECT count(*) as daily_count from charge c left join emplac e ON c.adr = e.adr where e.ADR is not null and e.empsta != 'I' and e.empsta != 'V' and trunc(c.datcre) >= to_date('2020-11-01','YYYY-MM-DD') and trunc(c.datcre) <= to_date('2021-11-30','YYYY-MM-DD') GROUP BY to_char(c.datcre, 'YYYY-MM-DD') )
方案2:保留每天的统计结果,同时显示全周期平均值
如果你需要同时返回每天的记录数以及全周期的日均数值,使用Oracle窗口函数实现,不需要调整GROUP BY逻辑:
SELECT count(*) as daily_value, avg(count(*)) over() as period_avg_value, 'Taux remplissage' as serie, to_char(c.datcre, 'YYYY-MM-DD') as arg from charge c left join emplac e ON c.adr = e.adr where e.ADR is not null and e.empsta != 'I' and e.empsta != 'V' and trunc(c.datcre) >= to_date('2020-11-01','YYYY-MM-DD') and trunc(c.datcre) <= to_date('2021-11-30','YYYY-MM-DD') GROUP BY to_char(c.datcre, 'YYYY-MM-DD') ORDER BY arg, serie
注:如果你原逻辑里avg(count(*))是要按其他维度分组求平均,可以调整over()中的partition by条件匹配业务需求
内容的提问来源于stack exchange,提问作者Electrob
相关产品推荐
相关产品推荐

