2016-03-15 2 views
0

Мой сценарий таков. Мне нужно указать имена учеников и количество конкретных оценок, которые они получили (в этом случае класс А). Рассмотрим первый запрос, как:SQL-запрос, необходимый для подсчета записей

SELECT studentID, fullname 
FROM tblStudents 

Следующий запрос:

SELECT studentID, grade, Count(grade) AS CountOfGrade 
FROM tblResults 
GROUP BY studentID, grade 
HAVING grade="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 
Смежные вопросы