0

フィールドempid、status、nameを持つテーブルemployeeがあります。同じ従業員 ID を持つ複数のレコードです。適用される条件は次のとおりです。

  1. 従業員 ID ごとに 1 つのレコードを取得する
  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が初めてです。任意の助けをいただければ幸いです.Thanks

4

4 に答える 4

0
select distinct empid, name from employee where status <> 'fail'
于 2012-06-18T17:21:36.863 に答える
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'

DISTINCTキーワードは、一意の値を取得するために使用されます。したがって、ここでは、「不合格」以外のステータスを持つ一意の従業員 ID が返されます。

于 2012-06-18T17:26:28.057 に答える
0

これを行う 1 つの方法は、-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 に答える