当没有找到值的记录时,期望计数为0

时间:2013-11-26 12:40:15

标签: sql

我有两张桌子,A和B.表A有学生名单。表B有他们的日期出勤率。我正在检查哪个学生出现了多少课程。对于从未出现过的学生,我没有记录。我想用他们的名字取0的记录。这是我正在使用的查询:

SELECT StudentName, Count(*) 
FROM Students, Attendance
WHERE Students.StudentID = Attendance.StudentID
GROUP BY StudentName

我已经检查了Mysql Count to return zero if no match中发布的问题的答案 我尝试使用解决方案中给出的左连接,但我仍然得到相同的结果。从未在考勤表中找到的学生不会出现在查询结果中。我希望看到他们的名字与他们的名字相反。 提前谢谢!

2 个答案:

答案 0 :(得分:1)

您应该使用left outer join,如下所示 -

SELECT StudentName, Count(Attendance.StudentID) 
FROM Students left outer join Attendance
on (Students.StudentID = Attendance.StudentID)
GROUP BY StudentName

修改

根据flexataclear突出显示的非常有效点,我已将count(*)表达式更改为count(Attendance.StudentID)。 现在它是如何工作的,如果我们想要获得0作为学生总数的情况,他们没有在考勤表中有任何条目,因为那些左外连接输出将在出勤时具有空值.studentID列。当我们尝试计算此列时,它将为这些学生返回零。

修改2

case - 我们还需要在classID上有条件(来自考勤表)

  SELECT studentname, COUNT(attendance.studentid)
    FROM students
    LEFT OUTER JOIN (SELECT * FROM attendance WHERE classid IN ('X', 'XI', 'XII')) 
                 AS Attendance 
      ON (students.studentid =attendance.studentid)
   GROUP BY studentname

我认为这可以解决您的问题。

答案 1 :(得分:0)

我忘记了isnull列上的classes(这是我的名字 - 不是你的名字),但它绝对适用于Sql Server: -

create table #students (
    studentid int,
    studentname varchar(50)
)
insert into #students values 
    (1,'david smith'),
    (2,'somebody else'),
    (3,'another person')

create table #attendance (
    studentid int,
    attendedon date
)
insert into #attendance values
     (1,'2013-01-01'),
     (3,'2013-01-01'),
     (3,'2013-01-02')

select s.studentname, isnull(a.classes,0) as classes
from #students s
left join (
    select studentid, count(*) as classes
    from #attendance
    group by studentid
) a on a.studentid=s.studentid
order by s.studentname

返回: -

studentname     classes
another person  2
david smith     1
somebody else   0