1

以下のような列 Name、EmailId、Process、Status を持つテーブルがあります。

**Input**

   Name       EmailId                Process      Status    
   apple1     apple@fruits.com       process1     Closed
   apple2     apple@fruits.com       process2     In Progress
   apple3     apple@fruits.com       process3     Complete      
   orange1    orange@fruits.com      process1     Closed
   orange2    orange@fruits.com      process2     Closed
   oran       orange@fruits.com      process3     Closed
   mango1     mango@fruits.com       process1     To Start

今、私が欲しいのは、すべてのプロセス(プロセス1、プロセス2、プロセス3)のステータスがクローズされている人のemailIdとステータスです

**Output**

EmailId              Status    
orange@fruits.com    Closed

オレンジのすべてのプロセスが閉じられているため、上記の行があります。同様に、プロセスが閉じられているテーブルのすべての電子メール ID を取得したいと考えています。

4

2 に答える 2

3

これを見つけるには、集計を使用して、節でCOUNT()count = 3 であることを確認できますHAVING。したがって、3 つすべてが閉じています。

SELECT
  EmailId,
  /* How many different processes are closed per EmailId */
  COUNT(DISTINCT Process) AS numclosed
FROM
  yourtable
WHERE Status = 'Closed'
GROUP BY EmailId
/* Return only those with 3 processes closed */
HAVING numclosed = 3

HAVING可能なプロセスの数が正確に 3 ではなく、それらすべてを説明する必要がある場合は、節でサブクエリを使用して、可能なプロセスの実際の数を見つけることができると思います。

SELECT
  EmailId,
  COUNT(DISTINCT Process) AS numclosed
FROM
  yourtable
WHERE Status = 'Closed'
GROUP BY EmailId
/* Compare the number closed for this EmailId against the number of possible Process values in the table */
HAVING numclosed = (SELECT COUNT(DISTINCT Process) FROM yourtable)
于 2012-07-12T12:19:57.450 に答える
2

別の方法:

SELECT 
    EmailId
FROM
    tableX AS t
GROUP BY 
    EmailId
HAVING
    COUNT( CASE WHEN Status <> 'Closed'
             THEN 1 
           END
         ) = 0 ;

また:

SELECT 
    t.EmailId
FROM
    ( SELECT DISTINCT EmailId
      FROM tableX 
    ) AS t
  LEFT JOIN
    tableX AS tt
      ON  tt.EmailId = t.EmailId
      AND tt.Status <> 'Closed'
WHERE
    tt.EmailId IS NULL ;
于 2012-07-12T12:40:15.293 に答える