2017-07-18 110 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