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
相关产品推荐
相关产品推荐

