Вывод количества типов людей на отдел с использованием внутреннего объединения

#mysql #sql #count #left-join #aggregate-functions

#mysql #sql #граф #левое соединение #агрегатные функции

Вопрос:

Мне нужно количество врачей, ординаторов, медсестер и пациентов в каждом отделении. Однако это не дает никаких результатов. Если я удалю 3 типа, это даст мне список подсчетов оставшихся типов людей. Как сделать так, чтобы результаты отображались при включении всех типов пользователей?

Спасибо.

 `SELECT DISTINCT
    department.departmentID,
    COUNT(doctor.doctorID) AS number_of_doctors,
    COUNT(resident.residentID) AS number_of_residents,
    COUNT(nurse.nurseID) AS number_of_nurses,
    COUNT(patient.patientID) AS patient_count

FROM department
    INNER JOIN person ON department.departmentID = person.departmentID
    INNER JOIN doctor ON doctor.employeeID = person.personID
    INNER JOIN resident ON resident.employeeID = person.personID
    INNER JOIN nurse ON nurse.employeeID = person.personID
    INNER JOIN patient ON patient.patientID = person.personID
GROUP BY department.departmentID'
 

Комментарии:

1. Поскольку вы используете внутреннее объединение медсестры, врача, ординатора и пациента, вы, по сути, запрашиваете людей, которые являются всеми четырьмя. Вам лучше сделать подвыборку для каждой категории.

2. Рассмотрите возможность решения проблем отображения данных в коде приложения

Ответ №1:

Предположительно, у вас не может быть человека, который одновременно является врачом, ординатором, медсестрой и пациентом. Так что используйте left join s :

 SELECT
    de.departmentID,
    COUNT(do.doctorID  ) AS number_of_doctors,
    COUNT(re.residentID) AS number_of_residents,
    COUNT(nu.nurseID   ) AS number_of_nurses,
    COUNT(pa.patientID ) AS patient_count
FROM department de
INNER JOIN person   pe ON de.departmentID = pe.departmentID
LEFT  JOIN doctor   do ON do.employeeID   = pe.personID
LEFT  JOIN resident re ON re.employeeID   = pe.personID
LEFT  JOIN nurse    nu ON nu.employeeID   = pe.personID
LEFT  JOIN patient  pa ON pa.patientID    = pe.personID
GROUP BY de.departmentID