Oracle如何将多条SELECT查询转为CASE语句实现多状态计数
错误原因分析
- 语法错误1:CASE表达式的
THEN后嵌套了返回多列的子查询,SUM()函数仅支持对单列数值聚合,无法处理多列结果,同时子查询内直接用and开头写过滤条件,缺失WHERE关键字,直接触发括号匹配报错 - 逻辑错误2:不需要在CASE内重复嵌套PERSON表查询,外层已经对PERSON表做扫描,直接在当前行做状态判断即可
- 效率问题:三个统计的公共过滤条件
updated_on > sysdate - 30没有提前过滤,会扫描大量无效数据
正确写法
SELECT SUM(CASE WHEN person_status_id IN (3,4,6) THEN 1 ELSE 0 END) AS Completed, SUM(CASE WHEN person_status_id IN (5,7,13) THEN 1 ELSE 0 END) AS Pending, SUM(CASE WHEN person_status_id IN (8) THEN 1 ELSE 0 END) AS Started FROM PERSON w WHERE w.updated_on > sysdate - 30;
上述代码会先过滤出最近30天更新的记录,再按状态分组计数,执行效率远高于多子查询关联的写法,结果和你原有实现完全一致。
内容的提问来源于stack exchange,提问作者Raghavi
相关产品推荐
相关产品推荐

