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

SQL查询添加条件标识列遇问题:CASE WHEN用法错误求助

解决SQL条件标识列的错误问题

你的问题出在CASE WHEN的判断逻辑上:Temp1子查询只返回全局最大利润这一个值,Temp1.profit=Max(Temp1.profit)这个条件永远为真(因为单值的最大值就是它本身),所以所有行都会匹配第一个分支,导致feature列全显示'most profitable'。

正确写法1:直接在CASE中判断全局极值

不需要额外关联临时表,直接在CASE WHEN里用子查询获取全局最大利润和最小预算,和当前行的字段做对比:

SELECT DISTINCT
    CASE
        -- 判断当前影片是否是盈利最高的
        WHEN (Films.gross - Films.budget) = (SELECT MAX(gross - budget) FROM Films) THEN 'most profitable'
        -- 判断当前影片是否是成本最低的
        WHEN Films.budget = (SELECT MIN(budget) FROM Films) THEN 'least expensive'
    END AS feature,
    Films.title,
    Films.year
FROM Films
WHERE
    (Films.gross - Films.budget) = (SELECT MAX(gross - budget) FROM Films)
    OR Films.budget = (SELECT MIN(budget) FROM Films);

正确写法2:预计算全局极值(效率更高)

如果数据量较大,推荐先通过子查询计算一次全局最大利润和最小预算,再通过交叉关联匹配,避免重复执行子查询:

SELECT DISTINCT
    CASE
        WHEN (f.gross - f.budget) = global.max_profit THEN 'most profitable'
        WHEN f.budget = global.min_budget THEN 'least expensive'
    END AS feature,
    f.title,
    f.year
FROM Films f
-- 交叉关联全局极值表(仅一行数据)
CROSS JOIN (
    SELECT 
        MAX(gross - budget) AS max_profit,
        MIN(budget) AS min_budget
    FROM Films
) AS global
WHERE
    (f.gross - f.budget) = global.max_profit
    OR f.budget = global.min_budget;

特殊情况处理

如果存在影片同时满足两个条件(比如既是盈利最高又是成本最低),可以根据需求调整CASE WHEN的顺序,或者新增分支标注(比如THEN 'both most profitable and least expensive')。

内容的提问来源于stack exchange,提问作者Matteo Spinelli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 03:31:04