Мне дали базу данных, которая имеет следующие 3 таблицы:
instructor(ID, name, dept_name, salary)
teaches(ID, course_id, sec_id, semester, year)
takes(ID, course_id, sec_id, semester, year, grade)
Цель запроса - подсчитать общее количество учеников, которых учил каждый учитель, но каждый ученик может быть учтен только один раз на учителя. Моя проблема сейчас в том, что учителя, которые учат нулевых учеников, не включаются.
Пример вывода, который я хотел бы получить, выглядит примерно так:
dept_name id ins_name students_taught
Accounting 79081 Ullman 1218
Accounting 14365 Lembr 529
Accounting 77645 Jarold 0
Astronomy 43779 Romero 981
Athletics 41930 Tung 749
Athletics 63287 Jaekel 524
Athletics 15347 Bawa 266
Athletics 76458 Smith 0
Biology 81991 Valtchev 550
Biology 80759 Queiroz 312
Biology 98738 Quincy 0
Biology 22213 Lee 0
Comp. Sci. 34175 Bondi 817
Comp. Sci. 3335 Bourrier 566
Но проблема в том, что я получаю это вместо:
dept_name id name students_taught
Accounting 79081 Ullman 1218
Accounting 14365 Lembr 529
Astronomy 43779 Romero 981
Athletics 41930 Tung 749
Athletics 63287 Jaekel 524
Athletics 15347 Bawa 266
Biology 81991 Valtchev 550
Biology 80759 Queiroz 312
Comp. Sci. 34175 Bondi 817
Comp. Sci. 3335 Bourrier 566
Я пробовал много разных способов сделать это, например, использование предложений where или использование левых соединений, но результат всегда один и тот же. Что-то мне не хватает?
Для справки, здесь я сделал две разные попытки решить эту проблему:
Attempt 1:
SELECT instructor.dept_name AS dept_name,
instructor.id AS inID,
instructor.name AS name,
count(DISTINCT takes.id) AS total
FROM instructor
LEFT OUTER JOIN teaches ON instructor.id = teaches.id
JOIN
(SELECT dept_name,
id,
name
FROM instructor) AS ins,
takes
WHERE takes.course_id = teaches.course_id
AND takes.sec_id = teaches.sec_id
GROUP BY inID
ORDER BY dept_name,
total DESC;
Attempt 2:
SELECT instructor.dept_name AS dept_name,
instructor.id,
instructor.name,
count(DISTINCT takes.id) AS total
FROM instructor
INNER JOIN teaches ON teaches.id = instructor.id
INNER JOIN takes ON takes.course_id = teaches.course_id
AND takes.sec_id = teaches.sec_id
GROUP BY ins.id
ORDER BY dept_name,
total DESC;