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

Oracle SQL中CASE WHEN多条件使用报错ORA-00937的排查与解决

ORA-00937: 非单组分组函数错误的原因与解决方法

根本原因

  1. 聚合函数与非聚合列混用且无GROUP BY:你的SQL中同时使用了聚合函数SUM(TB2.APPROVE_TOTAL)和非聚合列TB2.BENE_CODE,但未指定GROUP BY子句。Oracle的聚合规则明确要求:若SELECT子句包含聚合函数,所有非聚合列必须出现在GROUP BY中;反之,GROUP BY中的列必须在SELECT中作为非聚合列或被聚合函数包裹。
  2. 表别名未关联:SQL中FROM的是clm_header_tr TB1,但CASE里引用的是TB2,说明缺少TB1与TB2的关联语句(如JOIN),这会导致Oracle无法识别TB2表。

解决方案

根据你的统计需求,分两种场景处理:

场景1:按TB2.BENE_CODE分组统计

如果需要对每个BENE_CODE分别计算符合条件的总额,需补上表关联并添加GROUP BY:

SELECT
    CASE 
        WHEN TB2.BENE_CODE NOT LIKE '%ET%' AND SUM(TB2.APPROVE_TOTAL) > 0  
        THEN SUM(TB2.APPROVE_TOTAL)
        ELSE 0 
    END AS Total_PayAmount  
FROM clm_header_tr TB1
-- 替换为实际的关联字段和表名
JOIN 你的TB2表名 TB2 ON TB1.关联字段 = TB2.关联字段
GROUP BY TB2.BENE_CODE;

场景2:全局统计符合条件的总额

如果不需要分组,仅需统计所有BENE_CODE NOT LIKE '%ET%'记录的总额,可通过以下两种方式实现:

方法1:子查询过滤后聚合

SELECT
    CASE 
        WHEN SUM(APPROVE_TOTAL) > 0 THEN SUM(APPROVE_TOTAL)
        ELSE 0 
    END AS Total_PayAmount  
FROM (
    SELECT TB2.APPROVE_TOTAL
    FROM clm_header_tr TB1
    JOIN 你的TB2表名 TB2 ON TB1.关联字段 = TB2.关联字段
    WHERE TB2.BENE_CODE NOT LIKE '%ET%'
);

方法2:嵌套CASE实现条件聚合

SELECT
    CASE 
        WHEN SUM(CASE WHEN TB2.BENE_CODE NOT LIKE '%ET%' THEN TB2.APPROVE_TOTAL ELSE 0 END) > 0  
        THEN SUM(CASE WHEN TB2.BENE_CODE NOT LIKE '%ET%' THEN TB2.APPROVE_TOTAL ELSE 0 END)
        ELSE 0 
    END AS Total_PayAmount  
FROM clm_header_tr TB1
JOIN 你的TB2表名 TB2 ON TB1.关联字段 = TB2.关联字段;

内容的提问来源于stack exchange,提问作者schsn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 12:15:07