如何在同一天找到不包含结果的结果

时间:2017-02-06 21:34:21

标签: mysql sql

我试图找出如何在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年2月1日看到这两个条目,因为第一个和第三个有'通过'结果。

这是我最近的尝试:

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条。

2 个答案:

答案 0 :(得分:1)

这里有一种方式 - 选择所有失败的日期,然后在这些日期的同一个表格中使用&#39;通过&#39;状态。然后你只需要行为NULL的行(即没有Passed状态)......

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 :(得分:0)

SchemaVersion

相同的变体,假设它们是唯一的两个可能的值:

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

如果您稍后引入新状态,使用第一选择可能更安全。