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

如何使同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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 13:50:01