2017-07-18 88 views
2

我想写一个查询,返回学校的名称,付款年份,付款的成本和学生人数有付款的一年。 我遇到的问题是,某一年有0名学生,所以查询不会返回任何行,虽然有付款。SQL查询不返回行时计数(*)= 0与WHERE子句

这里是我的尝试:

SELECT School.NAME, 
     Payment.year, 
     Payment.amount, 
     Count(Student.id_stud) AS 'nb stud' 
FROM School 
     LEFT JOIN Student 
       ON school.id_school = Student.id_school 
     LEFT JOIN Payment 
       ON School.id_school = Payment.id_School 
WHERE Year(Student.date_in) <= Payment.year 
GROUP BY School.NAME, 
      Payment.amount, 
      Payment.year 

我想显示每一行即使COUNT(Student.id_stud)为0 我认为问题出在WHERE子句。

+1

Jatin C和Pரதீப்的两个答案都是有意义的,并且似乎对我有用。也许考虑分享一些'DECLARE TABLE'和'INSERT INTO',这样我们所有人都可以一起复制这些问题。 – KtX2SkD

回答

2

移动Year(Student.date_in)过滤器ON条件

SELECT School.NAME, 
     Payment.year, 
     Payment.amount, 
     Count(Student.id_stud) AS 'nb stud' 
FROM School 
     LEFT JOIN Student 
       ON school.id_school = Student.id_school 
     LEFT JOIN Payment 
       ON School.id_school = Payment.id_School 
      AND Year(Student.date_in) <= Payment.year 
GROUP BY School.NAME, 
      Payment.amount, 
      Payment.year 

如果您在Where条款过滤Year(Student.date_in),对于非匹配Student.date_in将有NULL值。那些NULL值将被where条件过滤。因此,将过滤器移至ON子句,它会告知哪些记录要加入,而不是过滤结果。同样的逻辑也将应用于Payment.year

+0

谢谢你的回答。通过这个查询,我得到了一个没有付款和没有学生的学校。但是那些支付学校但没有学生的学校当年没有出现 – 281

1

可能有两个原因为什么没有任何结果 1.在比较中使用的字段的值为空 2.存在左连接,所以有可能没有匹配为学生或支付记录,所以如果在那里使用条件那么必须有匹配的记录。你可以尝试下面的查询,也是检查空值。

SELECT School.NAME, 
     Payment.year, 
     Payment.amount, 
     Count(Student.id_stud) AS 'nb stud' 
FROM School 
     LEFT JOIN Student 
       ON school.id_school = Student.id_school 
     LEFT JOIN Payment 
       ON School.id_school = Payment.id_School 
WHERE Year(Student.date_in) <= Payment.year 
OR Student.date_in is null OR Payment.year is null 
GROUP BY School.NAME, 
      Payment.amount, 
      Payment.year 
+0

谢谢你的回答。正如普京的询问,我得到了没有付款和没有学生的学校的行,但是我没有得到那些学校在某年没有学生付款的学校排名 – 281