获取不包含任何行中的值的不同行的计数

时间:2014-07-25 17:02:42

标签: sql sql-server

我有一个表有多个行,用于相同的ID。我需要返回不包含值的行的不同ID的计数。我尝试过这样的事情:

SELECT COUNT(DISTINCT studID) AS 'ID' 
    FROM all_classes WHERE absences=0 
    AND (SELECT DISTINCT studID 
        FROM all_classes 
        WHERE absences<>0)
    <>studID;

在这个例子中,我试图编写一个查询来查找所有班级中没有缺席的学生人数。如果它们在一个类中缺少但在其他类中为零,则应忽略它们(这就是我使用嵌套查询,但它不起作用)。提前感谢您的任何建议。

4 个答案:

答案 0 :(得分:3)

重写查询的正确方法如下:

SELECT COUNT(DISTINCT studID) AS 'ID' -- 'total students' makes more sense?
FROM all_classes
WHERE studID NOT IN(
    SELECT studID 
    FROM all_classes 
    WHERE absences <> 0
)

但是,当您实际上没有使用子查询选择某些内容时,最好使用存在:

SELECT COUNT(DISTINCT studID) AS 'ID'
FROM all_classes a
WHERE NOT EXISTS(
    SELECT * 
    FROM all_classes a1 
    WHERE a1.studID = a.studID 
    AND absences > 0 -- I assume absences can't be negative
)

答案 1 :(得分:1)

可以这么简单:

SELECT Count(studID) AS IDCount
FROM all_classes
GROUP BY studID
HAVING SUM(absences) = 0

答案 2 :(得分:1)

我认为你很亲密。我会使用NOT IN子查询。我并不认为第一个标准是必要的。

这应该拉出id的所有行都缺席的任何学生ID = 0

SELECT COUNT(DISTINCT studID) AS 'ID' 
FROM all_classes WHERE studID NOT IN 
    (SELECT DISTINCT studID 
    FROM all_classes 
    WHERE absences<>0);

答案 3 :(得分:0)

你想要的只是一个没有缺席的学生的人数。这应该有效。

select Count(*) 
from all_classes 
group by stud_id 
having sum(absences)=0

这将为你提供有关学生的研究。

select studid
from all_classes 
group by stud_id 
having sum(absences)=0