如何编写Case语句实现按员工仅展示PCT=100对应Flag='Y'的单行数据
解决方案
核心思路是通过WHERE子句添加过滤逻辑,区分两类员工的数据展示规则:
方法一:直接在WHERE中判断(高效简洁)
SELECT -- 保留你原查询中的其他字段 CASE WHEN PCT = 100 THEN 'Y' ELSE 'N' END AS Utility_PCT FROM -- 你的多表连接语句(例如:table1 JOIN table2 ON table1.id = table2.id) WHERE -- 规则1:非Chris、John的员工,保留所有行 employee_name NOT IN ('Chris', 'John') -- 规则2:Chris、John仅保留PCT=100(即Utility_PCT='Y')的行 OR (employee_name IN ('Chris', 'John') AND PCT = 100)
方法二:用CTE/子查询先计算Utility_PCT再过滤(可读性更强)
如果你的Case逻辑复杂,或者需要多次使用Utility_PCT字段,可以先将查询结果存入临时数据集再过滤:
WITH temp_employee_data AS ( SELECT -- 原查询的所有字段 employee_name, PCT, CASE WHEN PCT = 100 THEN 'Y' ELSE 'N' END AS Utility_PCT FROM -- 你的多表连接语句 ) SELECT * FROM temp_employee_data WHERE employee_name NOT IN ('Chris', 'John') OR (employee_name IN ('Chris', 'John') AND Utility_PCT = 'Y')
说明
- 方法一中直接用
PCT = 100代替Utility_PCT = 'Y',因为两者逻辑完全等价,避免重复计算Case表达式,性能更好。 - 如果员工姓名存在大小写差异,可以用
UPPER(employee_name) IN ('CHRIS', 'JOHN')来兼容。
内容的提问来源于stack exchange,提问作者user16399158
相关产品推荐
相关产品推荐

