SQL Query不使用WHERE子句在count(*)= 0时返回行

时间:2017-07-18 09:54:38

标签: sql sql-server

我试图写一个查询,该查询返回学校名称,付款年份,付款成本以及付款年份的学生人数。 我遇到的问题是,某一年有0名学生,所以虽然有付款,但查询并没有返回任何一行。

这是我试过的:

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子句中。

2 个答案:

答案 0 :(得分: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 

您在Year(Student.date_in)子句中过滤Where的位置,因为不匹配的Student.date_in会有NULL个值。这些NULL值将按where条件进行过滤。因此,将过滤器移动到ON子句,它会告诉要连接的记录是什么,而不是过滤结果。同样的逻辑也适用于Payment.year

答案 1 :(得分:1)

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

- include: ssl_pull.yml
  when: "'renewal' in ACTIONS"