Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите с запросом в SQL

Gg Ученик (30), открыт 2 недели назад
Привет!

Диаграмма:



Задание:Решение первого задания:
 SELECT  
Штат.кодОтдела AS код_подразделения,
Штат.кодДолжности AS код_должности,
COUNT(Назначения.Номер_назначения) AS занято_штатных_единиц
FROM Штат
LEFT JOIN Назначения
ON Штат.кодОтдела = Назначения.кодОтдела AND
Штат.кодДолжности = Назначения.кодДолжности AND
Назначения.датаУвольнения IS NULL
GROUP BY Штат.кодОтдела, Штат.кодДолжности
А как можно решить второе задание ?
1 ответ
Chromatic Scale Искусственный Интеллект (134743) 2 недели назад
Для решения второго задания, вам нужно посчитать количество вакансий по каждому подразделению на основе штатной численности (из таблицы `Штат`) и количества реально занятых штатных единиц (которое можно вычислить из таблицы `Назначения`), таким образом, чтобы узнать, сколько вакантных должностей осталось в каждом подразделении.

Так как вы уже рассчитали количество занятых штатных единиц в первом задании, вам нужно будет использовать это во втором запросе, чтобы получить количество вакансий, вычитая количество занятых единиц из общего количества штатных единиц (поле `кол_во` в таблице `Штат`).

Вот пример 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` добавляет упорядочение по коду подразделения и должности для более читаемой выдачи.
GgУченик (30) 2 недели назад
Спасибо за ответ! А можете пожалуйста объяснить почему в столбце вакансии есть значение -1 ?
Chromatic Scale Искусственный Интеллект (134743) Gg, Появление отрицательного значения `-1` в столбце вакансий может быть вызвано несколькими причинами, основываясь на структуре данных и логике запроса: 1. **Превышение количества занятых позиций над штатной численностью**: Это может произойти, если в таблице `Назначения` зарегистрировано больше активных назначений для конкретной должности, чем предусмотрено штатным расписанием в таблице `Штат`. Это может случиться из-за ошибок в данных или особенностей процессов найма, где временно допускается перекрытие ставок. 2. **Ошибки в данных**: Если данные были введены некорректно или произошла ошибка при синхронизации баз данных, это может привести к тому, что фактическое количество занятых единиц превышает количество доступных вакансий.
GgУченик (30) 2 недели назад
Chromatic Scale
 SELECT  
Должности.названиеДолжности,
Штат.кол_во - COALESCE(занято.занято_штатных_единиц, 0) AS вакансий
FROM Штат
LEFT JOIN (
SELECT
Штат.кодОтдела,
Штат.кодДолжности,
COUNT(Назначения.Номер_назначения) AS занято_штатных_единиц
FROM Штат
LEFT JOIN Назначения ON Штат.кодОтдела = Назначения.кодОтдела AND
Штат.кодДолжности = Назначения.кодДолжности AND
Назначения.датаУвольнения IS NULL
GROUP BY Штат.кодОтдела, Штат.кодДолжности
) AS занято ON Штат.кодОтдела = занято.кодОтдела AND Штат.кодДолжности = занято.кодДолжности INNER JOIN Должности ON занято.кодДолжности = Должности.кодДолжности
ORDER BY Штат.кодОтдела, Штат.кодДолжности;
Запрос выводит вакансии для должностей?
Chromatic Scale Искусственный Интеллект (134743) Gg, Ваш SQL-запрос предназначен для отображения названия каждой должности вместе с количеством вакансий на эту должность. Однако есть одна проблема в этом запросе: в использовании `INNER JOIN` для связывания таблицы `Должности` с подзапросом `занято`. Это связывание может привести к непреднамеренному исключению некоторых должностей из результата, особенно если на некоторые должности нет назначенного персонала (таким образом, они не будут присутствовать в результате подзапроса `занято`). Вот корректный запрос:
Похожие вопросы