2017-02-06 6 views
-1

SQLで返された一連の結果を取得する方法を理解しようとしています。同じ日に結果が含まれていない結果を見つける方法

値として「合格」または「失敗」のいずれかを持つ「ステータス」という列があります。同じテーブル内に「Date_Entered」の列があります

同じ日に「合格」がない「失敗」日をすべて返すクエリが必要です。

例:私の結果セットで

01/01/2017 - Failed 
01/01/2017 - Failed 
01/01/2017 - Failed 
01/01/2017 - Passed 

01/02/2017 - Failed 
01/02/2017 - Failed 

01/03/2017 - Passed 

は、私は第一と第三は、「合格」の結果を持っているので、2017年1月2日に両方のエントリを見てみたいです。ここで

は私の最も最近の試みです:

select COUNT(*) 
     , CAST(h.Status AS VARCHAR) status 
     , CAST(h.Location AS VARCHAR) location 
     , CAST(h.Date_Entered AS DATE) 

from de_Hgb h 
where 1=1 
and h.Date_Entered between '01/01/2017' and '01/31/2017 23:59:59' 
and h.status not in (SELECT CAST(g.Status AS VARCHAR) status FROM de_Hgb g WHERE 1=1 and g.Status <> 'Passed' AND g.Date_Entered = h.Date_Entered) 
GROUP BY h.date_entered, h.Status, h.location 

はしかし、これは私が何をしたいの逆数を返しています。これは私に第1と第3のためのエントリーを示しています。第2のものではありません。

+0

この文の欠陥を確認することはできますか?SELECT 3 BETWEEN 5 AND 4; – Strawberry

答えて

1

ここでは、失敗した日付をすべて選択し、その日付の同じテーブルに対して「合格」ステータスのまま残します。次に、NULLの行(つまり、合格のステータスはありません)が必要です。

SELECT DISTINCT failed.Date_Entered 
FROM de_Hgb AS failed 
LEFT JOIN de_Hgb AS passed 
    ON(passed.Date_Entered=failed.Date_Entered and passed.Status="Passed") 
WHERE failed.Status="Failed" AND passed.Status IS NULL; 
+1

ありがとうございます。これはすごくうまくいった。私はこれを考えないと馬鹿だと感じる。 – user3753620

0
select cast(date_entered as date) as date_entered 
from de_Hgb h 
where date_entered between ... 
group by cast(date_entered as date) 
having 
     count(case when Status = 'Failed' then 1 end) > 0 
    and count(case when Status = 'Passed' then 1 end) = 0 

ものは2つだけの可能な値と仮定同等であることにバリエーション:それはあなたが後で新しい状態を導入した場合に最初の選択肢を使用するように、おそらくほうが安全です

having count(case when Status = 'Failed' then 1 end) = count(*) 
having max(Status) = 'Failed' 

関連する問題