如何使同SELECT子句中一个CASE WHEN的ELSE等于另一个CASE结果
解决方案:在Oracle中实现CASE分支引用同SELECT的其他CASE结果
要实现当Cost计算结果为0时替换为对应行的Revenue值,由于Oracle不允许在同一SELECT层级直接引用列别名,你需要通过子查询/CTE先预计算Revenue和Cost,再在外层进行判断替换。以下是具体实现步骤:
1. 修正原SQL的语法错误
原SQL存在两个关键问题:
- 外部SELECT中
SUM(subselect.Revenue)后缺少逗号,导致语法报错 - 子查询使用聚合函数但未添加
GROUP BY,Oracle会拒绝执行
2. 具体实现方案
方案一:使用CTE(公共表表达式)清晰拆分逻辑
WITH subselect AS ( SELECT item, -- 计算Revenue SUM(CASE WHEN item IN ('1','2','3') THEN item_price * quantity ELSE 0 END) AS REVENUE, -- 计算原始Cost SUM(CASE WHEN item IN ('1','2','3') THEN item_cost * quantity ELSE 0 END) AS COST FROM your_table_name -- 替换为你的实际表名 GROUP BY item -- 按item分组聚合 ) SELECT item, REVENUE, -- 当Cost为0时取Revenue,否则保留原Cost CASE WHEN COST = 0 THEN REVENUE ELSE COST END AS ADJUSTED_COST FROM subselect;
方案二:使用嵌套子查询
如果不习惯CTE,也可以用传统嵌套子查询实现:
SELECT item, REVENUE, CASE WHEN COST = 0 THEN REVENUE ELSE COST END AS ADJUSTED_COST FROM ( SELECT item, SUM(CASE WHEN item IN ('1','2','3') THEN item_price * quantity ELSE 0 END) AS REVENUE, SUM(CASE WHEN item IN ('1','2','3') THEN item_cost * quantity ELSE 0 END) AS COST FROM your_table_name GROUP BY item ) subselect;
3. 效果验证
针对你给出的示例数据:
- item3的原始Cost计算结果为0时,
ADJUSTED_COST会自动替换为对应Revenue值6 - 其他item的Cost非0时,将保留原始计算结果
内容的提问来源于stack exchange,提问作者Mindbender
相关产品推荐
相关产品推荐

