如何检查特定组中的每个值并设置标志状态?

时间:2017-09-02 12:11:17

标签: mysql sql

假设我有一张表" 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

2 个答案:

答案 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