Sql 当找不到某个值的记录时,计数应为0
我有两张桌子,A和B。A桌有学生名单。表B列出了他们的出席人数。我正在检查哪个学生上了多少课。我没有得到从未出现过的学生的记录。我想获取他们的记录,在他们的姓名前加上0。以下是我正在使用的查询:Sql 当找不到某个值的记录时,计数应为0,sql,Sql,我有两张桌子,A和B。A桌有学生名单。表B列出了他们的出席人数。我正在检查哪个学生上了多少课。我没有得到从未出现过的学生的记录。我想获取他们的记录,在他们的姓名前加上0。以下是我正在使用的查询: SELECT StudentName, Count(*) FROM Students, Attendance WHERE Students.StudentID = Attendance.StudentID GROUP BY StudentName 我已经检查了贴在网上的问题的答案 我尝试使用解决方案
SELECT StudentName, Count(*)
FROM Students, Attendance
WHERE Students.StudentID = Attendance.StudentID
GROUP BY StudentName
我已经检查了贴在网上的问题的答案
我尝试使用解决方案中给出的左连接,但仍然得到相同的结果。从未出现在考勤表中的学生不会出现在查询结果中。我想看到他们的名字与计数0对他们的名字。
提前谢谢 您应该使用
左外连接
如下-
SELECT StudentName, Count(Attendance.StudentID)
FROM Students left outer join Attendance
on (Students.StudentID = Attendance.StudentID)
GROUP BY StudentName
编辑
根据bendataclear强调的非常有效的一点,我已将count(*)
表达式更改为count(attention.StudentID)
。
现在看看它是如何工作的,如果假设我们想得到学生的0
作为总数,而他们在考勤表中没有任何条目,对于那些左侧的外部联接输出,将在Attention.studentID列中有空值,并且当我们尝试计算此列时,这些学生的值将返回零
编辑2
案例-我们还需要具备classID的条件(来自考勤表)
我想这可以解决您的问题。我忘记了
类
列上的isnull
(这是我的名字,不是你的),但它肯定在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
Count(*)
将为学生表中的所有学生返回大于0的值,您希望对左侧联接表中的一个字段进行计数,以获得匹配行的计数(例如Count(attentication.StudentID)
)谢谢Pratik和Ben!这解决了我的基本问题,但还有一个问题。为了简化查询,我删除了运行此查询的特定学生和特定类。如果我删除where子句,我将正确获得所有结果,但是,如果我添加where子句并指定我查询的学生列表和我要查询的班级列表,我将错过count为0的行。。对此有什么建议吗?如果您对带有“班级”列的考勤表设置条件,而相应的班级不在该表中,那么您将无法从该表中获得任何行结果,您将无法从该表中获得任何结果。为此,您可以在subqyery中使用该条件来代替考勤表。请参阅我的更新答案\n另外,左连接和左外部连接似乎给出了相同的结果?此答案早于问题中添加MySQL的日期-我不知道此语法在MySQL中是否有效-但我将把它留给那些在寻找Microsoft解决方案时遇到困难的人。谢谢David,但是,我在这方面遇到语法错误,无法尝试:(.我正在使用MS SQL。上面提供的第一个解决方案解决了我最初的问题。谢谢你的帮助!我的解决方案是特定于SQL server的。你确定你没有使用MySQL吗?我正在使用MS SQL 2005…我可能误解了语法?奇怪。这个问题被标记为MySQL,这导致了我的困惑。我在回答中看不到任何内容这将导致语法错误…但如果没有您的模式,则很难进行测试。我将再看一看,看看我是否疯了。。。
studentname classes
another person 2
david smith 1
somebody else 0