Oracle SQL SUM聚合查询结果异常问题排查求助
SQL查询问题分析与修复
你的查询核心问题是GROUP BY子句的分组依据错误:
- 你在SELECT里用CASE把不同动物映射成了
bird/mammal,但GROUP BY依然使用原始表的animal字段。 - Oracle的GROUP BY逻辑是基于原始列计算的,不会识别SELECT里的别名,导致每个原始动物(chicken、dog、cat)单独分组。虽然CASE把它们转成了统一的标签,但分组还是按原始值拆分,所以SUM只计算了单个动物的legs,最终出现重复的
bird和mammal行,总和没有正确聚合。
修正方案一:GROUP BY复用CASE表达式
把SELECT里的CASE表达式直接放到GROUP BY中,让分组逻辑和SELECT的映射逻辑完全一致:
SELECT CASE WHEN animal IN ('chicken', 'crow') THEN 'bird' WHEN animal IN ('dog', 'cat') THEN 'mammal' ELSE animal END AS animal, SUM(legs) AS legs FROM t1 WHERE animal IN ('chicken', 'crow', 'dog', 'cat') GROUP BY CASE WHEN animal IN ('chicken', 'crow') THEN 'bird' WHEN animal IN ('dog', 'cat') THEN 'mammal' ELSE animal END
修正方案二:用子查询先映射再分组
先通过子查询把原始动物转成目标分组标签,再对转换后的结果进行分组聚合,这样GROUP BY就能直接使用别名:
SELECT animal, SUM(legs) AS legs FROM ( SELECT CASE WHEN animal IN ('chicken', 'crow') THEN 'bird' WHEN animal IN ('dog', 'cat') THEN 'mammal' ELSE animal END AS animal, legs FROM t1 WHERE animal IN ('chicken', 'crow', 'dog', 'cat') ) GROUP BY animal
两种方案都能得到你想要的预期结果:
| animal | legs |
|---|---|
| bird | 4 |
| mammal | 8 |
内容的提问来源于stack exchange,提问作者Joe Liu
相关产品推荐
相关产品推荐

