Для решения второго задания, вам нужно посчитать количество вакансий по каждому подразделению на основе штатной численности (из таблицы `Штат`) и количества реально занятых штатных единиц (которое можно вычислить из таблицы `Назначения`), таким образом, чтобы узнать, сколько вакантных должностей осталось в каждом подразделении.
Так как вы уже рассчитали количество занятых штатных единиц в первом задании, вам нужно будет использовать это во втором запросе, чтобы получить количество вакансий, вычитая количество занятых единиц из общего количества штатных единиц (поле `кол_во` в таблице `Штат`).
Вот пример SQL-запроса, который может решить ваше второе задание:
SELECT
Штат.кодОтдела AS код_подразделения,
Штат.кодДолжности AS код_должности,
Штат.кол_во - COALESCE(занято.занято_штатных_единиц, 0) AS вакансий
FROM Штат
LEFT JOIN (
SELECT
Штат.кодОтдела,
Штат.кодДолжности,
COUNT(Назначения.Номер_назначения) AS занято_штатных_единиц
FROM Штат
LEFT JOIN Назначения ON Штат.кодОтдела = Назначения.кодОтдела AND
Штат.кодДолжности = Назначения.кодДолжности AND
Назначения.датаУвольнения IS NULL
GROUP BY Штат.кодОтдела, Штат.кодДолжности
) AS занято ON Штат.кодОтдела = занято.кодОтдела AND Штат.кодДолжности = занято.кодДолжности
ORDER BY Штат.кодОтдела, Штат.кодДолжности;
В этом запросе:
- Подзапрос `занято` используется для вычисления количества занятых штатных единиц для каждого подразделения и каждой должности.
- Использование `LEFT JOIN` обеспечивает, что все позиции из `Штат` будут включены в конечный результат, даже если для них нет соответствующих записей в `Назначения`.
- `COALESCE` используется для замены `NULL` значениями на `0`, чтобы обеспечить корректное вычитание и избежать ошибок при отсутствии назначений.
- `ORDER BY` добавляет упорядочение по коду подразделения и должности для более читаемой выдачи.
Диаграмма:
Задание:Решение первого задания: А как можно решить второе задание ?