SQL查询不返回行时计数(*)= 0与WHERE子句
我想写一个查询,返回学校的名称,付款年份,付款的成本和学生人数有付款的一年。 我遇到的问题是,某一年有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子句。
移动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
。
谢谢你的回答。通过这个查询,我得到了一个没有付款和没有学生的学校。但是那些支付学校但没有学生的学校当年没有出现 – 281
可能有两个原因为什么没有任何结果 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
谢谢你的回答。正如普京的询问,我得到了没有付款和没有学生的学校的行,但是我没有得到那些学校在某年没有学生付款的学校排名 – 281
Jatin C和Pரதீப்的两个答案都是有意义的,并且似乎对我有用。也许考虑分享一些'DECLARE TABLE'和'INSERT INTO',这样我们所有人都可以一起复制这些问题。 – KtX2SkD