AWS Athena中SQL CASE WHEN ELSE语句报错求助
问题分析与解决
报错原因
- 你错误地在
CASE语句里嵌套了完整的SELECT子查询,这种写法不符合Athena(基于Presto)的SQL规则——外层已经在执行分组聚合逻辑,内层没必要再写独立的查询返回多字段结果。 - 报错提示的本质是:外层查询的
SELECT列表里,你试图用CASE返回包含多个字段的结果集,但外层已经按projectid、fiscalYear、status分组,正确的做法应该是把判断逻辑嵌入到聚合函数内部,而非嵌套子查询。
修正后的SQL
不需要在WHEN和ELSE里重复FROM和GROUP BY内容,直接把CASE逻辑放到SUM函数里即可:
SELECT projectbudgets.projectid, projectbudgetyears.year AS fiscalYear, projectbudgetyears.status, SUM( CASE WHEN projectbudgetlineitems.costitemid IN (462561,462562,462563,462564,462565,462566,478030) THEN (0 * projectbudgetlineitems.unitcost) * (projectbudgetlineitems.costshare * 1E-2) ELSE (projectbudgetlineitems.quantity * projectbudgetlineitems.unitcost) * (projectbudgetlineitems.costshare * 1E-2) END ) AS total FROM (("acorn-prod-etl".target_acorn_prod_acorn_projectbudgets projectbudgets INNER JOIN "acorn-prod-etl".target_acorn_prod_acorn_projectbudgetyears projectbudgetyears ON (projectbudgets.id = projectbudgetyears.projectbudgetid)) INNER JOIN "acorn-prod-etl".target_acorn_prod_acorn_projectbudgetlineitems projectbudgetlineitems ON (projectbudgetyears.id = projectbudgetlineitems.projectbudgetyearid)) GROUP BY projectbudgets.projectid, projectbudgetyears.year, projectbudgetyears.status
调整说明
- 把
CASE判断直接放到SUM函数内部,对每条符合条件的记录计算对应的值,再统一聚合求和,完全符合分组聚合的逻辑。 - 外层
SELECT直接列出分组字段和聚合后的total,和GROUP BY的字段一一对应,解决了语法报错问题,同时实现了“特定costitemid分类的预算总额替换为0”的需求。
内容的提问来源于stack exchange,提问作者Steve83
相关产品推荐
相关产品推荐

