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

ORA-00936缺失表达式错误:AVG()子查询写法问题排查

问题分析与修正

原SQL的错误点

  • AVG函数的子查询写法错误:AVG需要接收一列数值或单个标量值,但你直接在AVG中嵌套了未加括号的多行子查询,Oracle无法识别这个表达式,直接抛出ORA-00936错误。
  • 逻辑运算符优先级错误:WHERE子句中AND clients.age <25 OR clients.age>40会被解析为(ops.value等于全局最大值 AND 年龄<25) OR 年龄>40,完全偏离了你筛选年龄<25或>40人群的需求,必须将年龄条件用括号包裹:AND (clients.age <25 OR clients.age>40)。
  • 未限定正向操作且全局最大值不符合需求:内层SELECT MAX(ops.value) FROM ops是取所有操作的最大值,没有限定为正向操作(value>0),也没有按年龄分组,无法得到目标人群的最大正向操作。
  • 外层FROM ops冗余:外层查询无需再从ops表取数,子查询已关联所有需要的表。

修正后的SQL(根据两种常见需求)

需求1:计算<25和>40两个群体各自的最大正向操作的平均值

先分别获取两个年龄组的最大正向操作值,再求这两个值的平均:

SELECT AVG(group_max) AS avg_max_positive_op
FROM (
    SELECT MAX(o.value) AS group_max
    FROM Ops o
    JOIN Accounts a ON a.cid = o.cid
    JOIN Clients c ON c.ssn = a.ssn
    WHERE o.value > 0  -- 限定为正向存款操作
    AND (c.age < 25 OR c.age > 40)
    GROUP BY CASE WHEN c.age < 25 THEN 'under25' ELSE 'over40' END
) groups;

需求2:计算所有符合年龄条件的客户各自的最大正向操作的平均值

每个符合条件的客户取自身的最大正向操作,再求这些值的平均:

SELECT AVG(client_max) AS avg_client_max_positive_op
FROM (
    SELECT MAX(o.value) AS client_max
    FROM Ops o
    JOIN Accounts a ON a.cid = o.cid
    JOIN Clients c ON c.ssn = a.ssn
    WHERE o.value > 0
    AND (c.age < 25 OR c.age > 40)
    GROUP BY c.ssn  -- 按客户分组,取单个客户的最大正向操作
) clients;

内容的提问来源于stack exchange,提问作者Mario Mateaș

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 14:25:16