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のステータスが閉じられている人の電子メールIDとステータスです。
**Output**
EmailId Status
orange@fruits.com Closed
オレンジのためのすべてのプロセスが閉じられているので、私は上記の行を持っている 同様に、プロセスが閉じられているテーブルのすべての電子メールIDを取得したいと思います。
回答:
回答№1は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 ;
回答№2の場合は3
これを見つけるには、集約を使用することができます 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
可能なプロセスの数が正確に3ではなく、それらのすべてを考慮する必要がある場合は、そのサブクエリを使用することができます HAVING
可能なプロセスの実際の数を見つける節
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)