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

如何对CASE表达式的返回结果执行GROUP BY分组操作

报错原因

SQL的逻辑执行顺序为 FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY,你在SELECT阶段才为CASE表达式定义别名Ticket,而GROUP BY执行优先级早于SELECT,此时别名还未生成,因此数据库会提示Ticket不是有效字段。

另外你提供的原SQL还存在语法疏漏:CAST ( SUM(AMT_1/100) AS DECIMAL(10,2) ) 与 Count(*) 两个返回字段之间缺少逗号,也会触发语法报错。

修复方案

方案1:将完整CASE表达式写入GROUP BY(全数据库兼容)

该方案兼容性最好,支持所有主流SQL数据库,无需调整语句结构:

SELECT 
CASE WHEN ( amt_1 >= 10000000                             ) THEN  'R100000'
     WHEN ( amt_1 <   9000000 and amt_1 >=  8000000       ) THEN  'R090000'
     WHEN ( amt_1 <   8000000 and amt_1 >=  7000000       ) THEN  'R080000'
     WHEN ( amt_1 <   7000000 and amt_1 >=  6000000       ) THEN  'R070000'
     WHEN ( amt_1 <   6000000 and amt_1 >=  5000000       ) THEN  'R060000'
     WHEN ( amt_1 <   5000000 and amt_1 >=  4000000       ) THEN  'R050000'
     WHEN ( amt_1 <   4000000 and amt_1 >=  3000000       ) THEN  'R040000'
     WHEN ( amt_1 <   3000000 and amt_1 >=  2000000       ) THEN  'R030000'
     WHEN ( amt_1 <   2000000 and amt_1 >=  1000000       ) THEN  'R020000'
     WHEN ( amt_1 <   1000000 and amt_1 >=  500000        ) THEN  'R010000'
     WHEN ( amt_1 <    500000 and amt_1 >=  100000        ) THEN  'R005000'
     WHEN ( amt_1 <    100000                             ) THEN  'R001000'             
END  as Ticket,    
CAST ( SUM(AMT_1/100) AS DECIMAL(10,2) ),
Count(*)     
FROM BASE24.PTLF 
GROUP BY 
CASE WHEN ( amt_1 >= 10000000                             ) THEN  'R100000'
     WHEN ( amt_1 <   9000000 and amt_1 >=  8000000       ) THEN  'R090000'
     WHEN ( amt_1 <   8000000 and amt_1 >=  7000000       ) THEN  'R080000'
     WHEN ( amt_1 <   7000000 and amt_1 >=  6000000       ) THEN  'R070000'
     WHEN ( amt_1 <   6000000 and amt_1 >=  5000000       ) THEN  'R060000'
     WHEN ( amt_1 <   5000000 and amt_1 >=  4000000       ) THEN  'R050000'
     WHEN ( amt_1 <   4000000 and amt_1 >=  3000000       ) THEN  'R040000'
     WHEN ( amt_1 <   3000000 and amt_1 >=  2000000       ) THEN  'R030000'
     WHEN ( amt_1 <   2000000 and amt_1 >=  1000000       ) THEN  'R020000'
     WHEN ( amt_1 <   1000000 and amt_1 >=  500000        ) THEN  'R010000'
     WHEN ( amt_1 <    500000 and amt_1 >=  100000        ) THEN  'R005000'
     WHEN ( amt_1 <    100000                             ) THEN  'R001000'             
END

方案2:用CTE预计算Ticket字段(可读性更高)

如果不想重复书写CASE逻辑,可以用CTE先计算好分组字段,外层再做聚合操作:

WITH ticket_data AS (
    SELECT 
        CASE WHEN ( amt_1 >= 10000000                             ) THEN  'R100000'
             WHEN ( amt_1 <   9000000 and amt_1 >=  8000000       ) THEN  'R090000'
             WHEN ( amt_1 <   8000000 and amt_1 >=  7000000       ) THEN  'R080000'
             WHEN ( amt_1 <   7000000 and amt_1 >=  6000000       ) THEN  'R070000'
             WHEN ( amt_1 <   6000000 and amt_1 >=  5000000       ) THEN  'R060000'
             WHEN ( amt_1 <   5000000 and amt_1 >=  4000000       ) THEN  'R050000'
             WHEN ( amt_1 <   4000000 and amt_1 >=  3000000       ) THEN  'R040000'
             WHEN ( amt_1 <   3000000 and amt_1 >=  2000000       ) THEN  'R030000'
             WHEN ( amt_1 <   2000000 and amt_1 >=  1000000       ) THEN  'R020000'
             WHEN ( amt_1 <   1000000 and amt_1 >=  500000        ) THEN  'R010000'
             WHEN ( amt_1 <    500000 and amt_1 >=  100000        ) THEN  'R005000'
             WHEN ( amt_1 <    100000                             ) THEN  'R001000'             
        END  as Ticket,
        AMT_1
    FROM BASE24.PTLF
)
SELECT 
    Ticket,
    CAST(SUM(AMT_1/100) AS DECIMAL(10,2)),
    Count(*)
FROM ticket_data
GROUP BY Ticket

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 10:54:01