如何使用sql中的count函数返回0

时间:2012-03-11 07:05:07

标签: sql

我有以下sql查询,它返回测试中的3年级学生 学生1在考试中取0,所以我的查询结果只返回两个学生的成绩我怎么能在结果中包含零?

select u.uno, u.fname, u.lname, count(q.qno) as Test1 from ((users u
LEFT OUTER JOIN userresponse ur on ur.uno = u.uno) left outer join
question q on q.correctanswer = ur.response and q.qno = ur.qno and
q.eno = ur.eno) where q.eno = '1' group by u.uno, u.fname, u.lname

ur.eno是考试1,然后问题编号和考试编号被加入,q.corectanswer = ur.response检查用户得到的问题ur.uno = u.uno只是加入表格。

1 个答案:

答案 0 :(得分:3)

如果我正确理解了您的数据库架构,那么应该获得0结果的第三个学生在userresponse表中没有相应的行?正常(“内部”)连接(如您正在使用的连接)将删除没有行的学生在userresponse表中加入它们。另一方面,外部联接将保留行,即使没有行将它们连接到另一个表中也是如此。因此,您应该在表用户和表userresponse之间使用外部联接。

编辑:

像这样(未经测试):

SELECT user.uno, user.fname, user.lname, 
       (COUNT(question.qno)*5)/75 as TESTRESULT1
  FROM ((user LEFT OUTER JOIN userresponse ON ....)
        LEFT OUTER JOIN question ON ....)
 WHERE
    ....
GROUP BY user.uno, user.fname, user.lname

在ON之后添加连接条件,在WHERE之后添加其他条件。第一个外部联接将保留所有学生,但是对于没有回复的学生,来自userresponse的列中包含空值。第二个外部联接仍然会让学生没有回复,表格中的列中的值为空值。

请注意,您需要将COUNT(*)更改为COUNT(question.qno),因为COUNT(*)会计算行数,而没有响应的每个学生现在都会在结果中添加一行。