Как подсчитать количество обучаемых студентов на одного преподавателя без учета дубликатов? - PullRequest
0 голосов
/ 22 марта 2019

Мне дали базу данных, которая имеет следующие 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;

1 Ответ

0 голосов
/ 22 марта 2019

Обратите внимание на комментарий @GordonLinoff в оригинальном сообщении. Я предполагаю, что Teaches.ID = Instructor.ID, как при попытке № 2. Если я ошибаюсь, то нет никакой связи, и, следовательно, вы не можете получить результаты, которые вы ищете.

Вы довольно близки со второй попыткой. Ошибка в группе по заявлению

SELECT a.dept_name
    ,a.ID
    ,a.NAME
    ,count(DISTINCT c.ID) AS Total
 FROM instructor a
 LEFT JOIN teaches b ON b.ID = a.ID
 LEFT JOIN takes c ON c.course_id = b.course_id
    AND c.sec_id = b.sec_id
GROUP BY a.dept_name
    ,a.ID
    ,a.NAME

Я проверил это, используя некоторые примеры данных, и они отлично работали.

Пример данных

Вот необработанные данные. Обратите внимание, что у этого профессора есть ученик в более чем 1 классе. Также обратите внимание, что в целях тестирования у меня дважды был указан студент в одном классе.

ID  name    dept_name   salary  ID  course_id   sec_id  semester    year    ID  course_id   sec_id  semester    year    grade
79081   Ullman  Accounting  100 79081   1   2   1   2019    13  1   2   1   2019    12
14365   Lembr   Accounting  100 14365   2   2   1   2019    14  2   2   1   2019    12
14365   Lembr   Accounting  100 14365   2   2   1   2019    14  2   2   1   2019    12
77645   Jarold  Accounting  100 77645   3   2   1   2019    10  3   2   1   2019    12
77645   Jarold  Accounting  100 77645   3   2   1   2019    11  3   2   1   2019    12
77645   Jarold  Accounting  100 77645   3   2   1   2019    12  3   2   1   2019    12
77645   Jarold  Accounting  100 77645   4   2   1   2019    10  4   2   1   2019    12

вот результаты

dept_name   ID  NAME    Total
Accounting  14365   Lembr   1
Accounting  77645   Jarold  3
Accounting  79081   Ullman  1

Надеюсь, это поможет !! Удачи!

...