0

我有一个表员工,其字段为 empid、status、name。它们是具有相同emp id的多条记录。要应用的条件如下:

  1. 为每个员工 id 获取一条记录
  2. 如果存在失败状态,则删除记录,除非它们具有扣留或撤回状态或两者兼而有之。

表结构:

empid      name      status
1          p1        fail
2          p2        pass
2          p2        fail
3          p3        pass
4          p4        pass
4          p4        onhold
5          p5        fail
5          p5        withheld
5          p5        withdrawn
6          p6        fail
6          p6        withheld
6          p6        withdrawn
6          p6        onhold
7          p7        fail
7          p7        withheld
8          p8        fail
8          p8        withdrawn
9          p9        fail
9          p9        withdrawn
9          p9        onhold
10         p10       pass
10         p10       onhold
10         p10       withdrawn
11         p11       waiting
11         p11       disburse
11         p11       withdrawn
12         p12       disburse
12         p12       fail

结果应如下所示:

empid      name
3          p3
4          p4
5          p5  
6          p6
7          p7
8          p8
9          p9
10         p10
11         p11

我是 MYSQL 的新手。任何帮助将不胜感激。谢谢

4

4 回答 4

0
SELECT DISTINCT empid, name FROM employee WHERE status != 'fail'

DISTINCT关键字用于获取唯一值。所以在这里它会返回唯一的员工ID,除了“失败”之外

于 2012-06-18T17:26:28.057 回答
0

一种方法是将值分配给 -1,1 和 1 以失败、撤回和保留。然后将它们相加并仅选择记录> 1

SELECT empid, 
       name 
FROM   employee 
GROUP  BY empid, 
          name 
HAVING Sum(CASE status 
             WHEN 'fail' THEN -1 
             WHEN 'withdrawn' THEN 1 
             WHEN 'withheld' THEN 1 
             ELSE 0 
           end) > -1 

演示

另一种更传统的方法使用 IN 和 NOT IN 子句

SELECT DISTINCT empid, 
                name 
FROM   employee 
WHERE  empid NOT IN (SELECT empid 
                     FROM   employee 
                     WHERE  status = 'fail') 
        OR empid IN (SELECT empid 
                     FROM   employee 
                     WHERE  status IN ( 'withheld', 'withdrawn' )) 

演示

于 2012-06-21T05:20:00.463 回答
0

这是您所问内容的正确(我希望)查询。它是这样工作的:它用一个整数值对每个状态进行评分。通过获得 0,失败获得 1,其他任何事情获得 2。查询按 empid 分组并聚合这 3 个可能值中的最大值。因此,如果最大值为 0,则意味着一切都通过了,所以我们希望它进入。如果最大值为 1,则意味着只有通过和失败,所以我们不希望它们进入。最后,如果最大值是 2 这意味着至少有一些状态不是通过或失败。如果我正确理解了你的问题,你也想要这些。

这是查询:

select empid, name
from
(
    select empid, name,
    max(if(status = 'pass', 0, if(status != 'fail', 2, 1))) as w
    from 
    emps
    group by empid
) t
where w != 1

(编辑掉之前的答案)

于 2012-06-18T17:41:49.423 回答
0
select distinct empid, name from employee where status <> 'fail'
于 2012-06-18T17:21:36.863 回答