我有两张桌子,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中发布的问题的答案 我尝试使用解决方案中给出的左连接,但我仍然得到相同的结果。从未在考勤表中找到的学生不会出现在查询结果中。我希望看到他们的名字与他们的名字相反。 提前谢谢!
答案 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