2016-03-15 94 views
0

我的場景是這樣的。我需要提供學生的姓名和他們所學的特定成績的數量(在這種情況下爲A級)。考慮第一個查詢爲:SQL查詢需要計數記錄

SELECT studentID, fullname 
FROM tblStudents 

下一個查詢是:

SELECT studentID, grade, Count(grade) AS CountOfGrade 
FROM tblResults 
GROUP BY studentID, grade 
HAVING grade="A"; 

我可以結合這些,這樣我可以通過加入查詢顯示A級爲每個學生數量:

SELECT tblStudents.studentID, tblStudents.fullname, tblResults.grade, Count(tblResults.grade) AS CountOfGrade 
FROM tblStudents INNER JOIN tblResults ON tblStudents.studentID = tblResults.studentID 
GROUP BY tblStudents.fullname, tblResults.grade 
HAVING tblResults.grade="A"; 

但是它並沒有返回沒有成績A的學生的姓名,只有一個學生的成績至少爲1.我嘗試過一次左側連接,而不是INNER,但這似乎沒有幫助。

我該如何做到這一點,以便我也得到零計數?例如:

Name Grade GradeCount 
Bob  A  1 
Jim  A  0 
Sarah A  4 
etc 

回答

2

嘗試LEFT JOIN由第二查詢產生的派生表:

SELECT t1.studentID, 
     t1.fullname, 
     'A' AS grade, 
     COALESCE(t2.CountOfGrade, 0) AS CountOfGrade 
FROM tblStudents AS t1 
LEFT JOIN (
    SELECT studentID, COUNT(grade) AS CountOfGrade 
    FROM tblResults 
    WHERE grade = 'A' 
    GROUP BY studentID 
) AS t2 ON t1.studentID = t2.studentID 

注:分組由grade場實際上是沒有必要的,因爲你只想要grade = 'A'記錄。您可以簡單地使用WHERE子句。

+0

感謝。真的很有幫助,最後我到了那裏。出於興趣,你必須改變表名嗎? – RGriffiths

1

如果字段等級總是等於參數:GRADE,那麼也可以使用子選擇來實現。

SELECT NAME, :GRADE GRADE , 
     (SELECT COUNT(1) 
      FROM GRADES 
     WHERE GRADE = :GRADE 
      AND GRADES.STUDENT_ID = S.STUDENT_ID) GRADECount 
    FROM STUDENTS S 

現在像你這樣的查詢需要,與parametergrade 'A':

SELECT NAME, 'A' GRADE , 
     (SELECT COUNT(1) 
      FROM GRADES 
     WHERE GRADE = 'A' 
      AND GRADES.STUDENT_ID = S.STUDENT_ID) GRADECount 
FROM STUDENTS S