SQL CASE语句结果不符预期,求按Num批量设置ClaimStatus的方案
问题与解决方案
问题说明
你需要按编号判断ClaimStatus:
- 若某编号下任意一行的
EventName为ClaimReassigned,则该编号所有行的ClaimStatus都显示为ClaimReassigned - 若编号下无
ClaimReassigned的行,则所有行显示Not ClaimReassigned
但当前使用的逐行判断CASE语句无法实现这个逻辑,只能单独标记有ClaimReassigned的行,其他同编号行仍显示Not ClaimReassigned:
CASE EventName WHEN 'ClaimReassigned' THEN 'ClaimReassigned' ELSE 'Not ClaimReassigned' END
解决方法
方法1:使用窗口函数(推荐,简洁高效)
通过窗口函数按编号分组,判断组内是否存在目标值,再生成统一状态:
CASE WHEN MAX(CASE WHEN EventName = 'ClaimReassigned' THEN 1 ELSE 0 END) OVER (PARTITION BY 你的编号列名) = 1 THEN 'ClaimReassigned' ELSE 'Not ClaimReassigned' END AS ClaimStatus
替换你的编号列名为实际存储编号的字段(比如示例里的040523000374对应的列),该方法支持MySQL 8+、PostgreSQL、SQL Server等主流数据库。
方法2:子查询关联(兼容老版本数据库)
先预查询每个编号的状态,再和原表关联:
SELECT t.*, s.ClaimStatus FROM 你的表名 t JOIN ( SELECT 你的编号列名, CASE WHEN EXISTS ( SELECT 1 FROM 你的表名 WHERE 你的编号列名 = t1.你的编号列名 AND EventName = 'ClaimReassigned' ) THEN 'ClaimReassigned' ELSE 'Not ClaimReassigned' END AS ClaimStatus FROM 你的表名 t1 GROUP BY 你的编号列名 ) s ON t.你的编号列名 = s.你的编号列名
内容的提问来源于stack exchange,提问作者Rashmi Wankhede
相关产品推荐
相关产品推荐

