Mysql 如何查找当天不包含结果的结果

Mysql 如何查找当天不包含结果的结果,mysql,sql,Mysql,Sql,我试图弄清楚如何在SQL中获得返回给我的一组结果 我有一个名为Status的列,它的值为“Passed”或“Failed”。同一表格中有一列表示输入的日期 我需要一个查询来返回“失败”的所有日期,这些日期在同一天没有“通过” 例如: 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

我试图弄清楚如何在SQL中获得返回给我的一组结果

我有一个名为Status的列,它的值为“Passed”或“Failed”。同一表格中有一列表示输入的日期

我需要一个查询来返回“失败”的所有日期,这些日期在同一天没有“通过”

例如:

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日的两个条目,因为第1个和第3个条目的结果都是“通过”

以下是我最近的一次尝试:

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
然而,这与我想要的正好相反;这是给我看的第一和第三个项目,而不是第二个

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
A假设只有两个可能值,则其变化是等效的:

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

使用第一个选项可能更安全,以防以后引入新的状态。

这里有一种方法-选择所有失败的日期,然后在那些状态为“已通过”的日期上与同一个表保持连接。然后,您只需要其中为空的行,即没有通过的状态

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;

你能看到这个语句中的缺陷吗:在5和4之间选择3;非常感谢。这项工作做得很出色。我觉得自己很愚蠢,没有想到这一点。