SQL


select t1.cmodality as 设备类型,
       t1.cbrlx as 病人类型,
       CASE
         WHEN '1' = '1' THEN
          t2.cbgysxm
         WHEN '2' = '1' THEN
          t2.cshysxm
       END AS 医生,
       count(t1.iid) as 检查次数,
       sum(t1.iprice) as 检查费用

  from icnris_exam t1, icnris_exam_bg t2
 where (t1.iid = t2.iexam_iid and t1.cjczt <> '已删除' and t2.cflag = '9' and
       t2.dbgsj is not null)
 group by t1.cmodality,
          t1.cbrlx,
          CASE
            WHEN '1' = '1' THEN
             t2.cbgysxm
            WHEN '2' = '1' THEN
             t2.cshysxm
          END

可以跑,但仍然不是“根据不同的 CASE 值来 GROUP BY 不同字段”,原因和以前一样:

  1. '1'='1' 永远真,'2'='1' 永远假,
    整个 CASE 在编译期就被优化器坍缩成

    t2.cbgysxm
    

    所以这条 SQL 实际等价于

    GROUP BY t1.cmodality, t1.cbrlx, t2.cbgysxm
    
  2. 一旦把常量换成变量(或绑定变量):

    CASE
      WHEN :flag = '1' THEN t2.cbgysxm
      ELSE t2.cshysxm
    END
    

    Oracle 在硬解析时无法确定到底用哪一列,就会报
    ORA-00979: not a GROUP BY expression


结论

  • 你现在的写法只是“写法上有 CASE,实质已经退化成单字段”,能跑但不具备动态能力
  • 真想“传参决定今天按 A 列、明天按 B 列分组” → 只能
    1. 动态 SQL 拼列名,或
    2. UNION ALL 把每种维度分别算好,前端/参数决定取哪一行。