我试图找出如何在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条。
答案 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
如果您稍后引入新状态,使用第一选择可能更安全。