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

执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 23:27:02