Oracle SQL需求:根据员工Flag组合生成对应状态
Oracle SQL 需求实现
原始表结构及数据
现有员工表(假设表名为employees)的结构和数据如下:
Emp_Id flag ------ ---- 101 Y 102 N 103 Y 103 N
需求说明
员工的flag存在三种组合情况:
- 仅含'Y'(如Emp_Id=101)
- 仅含'N'(如Emp_Id=102)
- 同时含'Y'和'N'(如Emp_Id=103)
需要编写Oracle SQL语句,得到如下期望结果:
Emp_Id Status ---------------- 101 Auto 102 Manual 103 Partial
解决方案
可以通过分组聚合结合条件判断实现,以下是两种可行写法:
方法一:CASE结合聚合函数
SELECT Emp_Id, CASE WHEN COUNT(DISTINCT flag) = 1 AND MAX(flag) = 'Y' THEN 'Auto' WHEN COUNT(DISTINCT flag) = 1 AND MAX(flag) = 'N' THEN 'Manual' ELSE 'Partial' END AS Status FROM employees GROUP BY Emp_Id ORDER BY Emp_Id;
方法二:LISTAGG拼接后判断
SELECT Emp_Id, CASE WHEN flag_list = 'Y' THEN 'Auto' WHEN flag_list = 'N' THEN 'Manual' ELSE 'Partial' END AS Status FROM ( SELECT Emp_Id, LISTAGG(DISTINCT flag, '') WITHIN GROUP (ORDER BY flag) AS flag_list FROM employees GROUP BY Emp_Id ) ORDER BY Emp_Id;
思路说明
两种方法均先按Emp_Id分组,对每个员工的flag做聚合处理:
- 方法一通过统计不同
flag的数量和最大值,判断所属类别 - 方法二通过拼接去重后的
flag字符串,直接匹配对应状态
内容的提问来源于stack exchange,提问作者Srinivasan
相关产品推荐
相关产品推荐

