Sql 过滤任何

Sql 过滤任何,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有下表: studentID subjectID PASS 101 1 T 102 1 F 101 2 F 101 3 T 102 2 F 如果一个学生没有通过他尝试过的所有科目,我应该发出警告 因此,在上述情况下,查询应该只返回102 注意-它也不应返回103,因为103没有尝试任何主题,因此我们将其加入学生表。您可以通过以下操作获得此类

我有下表:

studentID subjectID PASS
101        1         T
102        1         F
101        2         F
101        3         T
102        2         F  
如果一个学生没有通过他尝试过的所有科目,我应该发出警告

因此,在上述情况下,查询应该只返回102


注意-它也不应返回103,因为103没有尝试任何主题,因此我们将其加入学生表。

您可以通过以下操作获得此类学生的列表:

select studentId
from table t
group by studentId
having max(PASS) = 0;
你如何提高警惕是另一回事。你可能应该安排一份工作来做这件事

编辑:

嗯,从我最初的回答开始,通行证的定义就改变了。以下是字符字段的修订版:

select studentId
from table t
group by studentId
having sum(case when PASS = 'T' then 1 else 0 end) = 0;
列出所有科目都不及格的学生名单

试试这个

;with cte as
(
select studentID, case when pass='T' then 1 else 0 end as xx from #t
)
select studentID from cte  group by studentID having sum(xx)=0
或者没有CTE


如果它不在表中,为什么会返回103?要么我误解了这个可能的问题,要么你的数据与你所说的不匹配。101和102都未能通过样本数据集中的主题;为什么查询只返回102?一个学生只有在所有科目都不及格的情况下才应该返回attempted@IUnknown好吧,那么问题中的措辞是模棱两可的。当我读到这篇文章时,一个没有通过所有科目的学生是指至少有一门科目不及格,但可能通过了其他科目的学生。我建议通过明确地说“失败”来解决这个问题。PAST是NTO一个数字字段——当我想到这个例子时,我应该注意的。也许你应该考虑复习你的答案。仅仅因为它是文本而不是数字,并不意味着你不能使用第一个简单的形式——T比F晚一些。所以MAXPASS='F'应该有效。
select studentID from 
(
select studentID, case when pass='T' then 1 else 0 end as xx from #t
)x
group by studentID having sum(xx)=0