假设我有一张表" Emp"
Dpt_ID | E_ID | E_Status
A1 | 00200 | H
A1 | 00200 | M
A1 | 00400 | H
A1 | 00400 | M
A2 | 00300 | L
A2 | 00300 | M
A2 | 00400 | L
A2 | 00400 | L
数据需要根据Dpt_ID分组,如果该Dpt_ID下的任何E_ID具有status = H,则Set Flag = High。同样,如果该Dpt_ID下的任何E_ID状态= M,则设置标志=中等低。
目前我已经编写了以下查询,但是按功能分组只检查第一行:
SELECT Dpt_ID,E_ID,E_Status,(CASE
WHEN E_Status = "H" THEN 'High'
WHEN E_Status = "M" THEN 'Medium'
ELSE 'Low'
END) AS Flag
FROM Emp
group by Dpt_ID
如何检查Dpt_ID组中的每个值以查看它是否为H / M / L?
E.g。目标应显示为
Dpt_ID | Flag
A1 | High
A2 | Medium
答案 0 :(得分:0)
你很亲密。你可以这样做:
SELECT Dpt_ID, E_ID, E_Status,
(CASE WHEN MAX(E_Status = 'H') THEN 'High'
WHEN MAX(E_Status = 'M') THEN 'Medium'
ELSE 'Low'
END) AS Flag
FROM Emp
GROUP BY Dpt_ID;
答案 1 :(得分:0)
这里的问题是你不能直接使用MAX()
,因为你有任意的char值,一个选项是为你的值分配一个权重,这样你就可以使用MAX()
,然后获得标志使用权重值:
SELECT Dpt_ID,
CASE MAX(CASE E_Status WHEN 'H' THEN 2 WHEN 'M' THEN 1 ELSE 0 END)
WHEN 2 THEN 'High' WHEN 1 THEN 'Medium' ELSE 'Low' END AS Flag
FROM Emp
group by Dpt_ID