#sql #oracle
#sql #Oracle
Вопрос:
я хочу отобразить department_id
‘s вместе с count, и количество должно быть больше 5, и я хочу, чтобы у меня были сотрудники, которые не были наняты в январе.
я попробовал следующий запрос
SELECT * FROM EMPLOYEES
WHERE DEPARTMENT_ID IN
(
SELECT DEPARTMENT_ID
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID
HAVING COUNT(*)>5
)
AND HIRE_DATE NOT LIKE '%JAN%';
но здесь я не получил подсчета.Я также хочу подсчитать.
Комментарии:
1. Конечно, вы не получили количество, вы его никогда не выбирали
Ответ №1:
SELECT department_ID, count(employee_id) as '# of Employees' FROM EMPLOYEES
WHERE DEPARTMENT_ID IN
(
SELECT DEPARTMENT_ID
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID
HAVING COUNT(*)>5
)
AND HIRE_DATE NOT LIKE '%JAN%'
group by department_ID;
Этот запрос возвращает department_id, и поскольку я группирую по department_id, будет возвращено количество сотрудников, принадлежащих к каждому отделу
Вывод будет выглядеть примерно так
Department_Id | # of Employees
1 7
2 6
4 9
Ответ №2:
Если вам нужен идентификатор отдела и количество сотрудников (где дата найма сотрудника не указана в январе), то должно сработать что-то вроде следующего. Я говорю «что-то вроде следующего», потому что подозреваю, что ЗНАЧЕНИЕ WHERE hire_date НЕ ПОХОЖЕ НА ‘%JAN%’, можно было бы улучшить, но это будет зависеть только от формата этого столбца.
SELECT
DEPARTMENT_ID,
COUNT(*)
FROM EMPLOYEES
WHERE HIRE_DATE NOT LIKE '%JAN%'
GROUP BY DEPARTMENT_ID
HAVING COUNT(*)>5;
Если вы также хотите перечислить отдельных сотрудников вместе с этими отделами, то может сработать что-то вроде этого:
SELECT a.*, b.count(*)
FROM EMPLOYEES AS a
INNER JOIN (
SELECT
DEPARTMENT_ID,
COUNT(*)
FROM EMPLOYEES
WHERE HIRE_DATE NOT LIKE '%JAN%'
GROUP BY DEPARTMENT_ID
HAVING COUNT(*)>5) AS b
ON a.department_id = b.department_id
WHERE a.HIRE_DATE NOT LIKE '%JAN%';
Опять же, я думаю, вы можете использовать свою схему для улучшения предложения where в HIRE_DATE. Предложение like / not-like обычно выполняется довольно медленно.
Ответ №3:
Выберите количество из вашего внутреннего запроса и присоединитесь к нему:
SELECT E.*, DEPT_COUNT
FROM EMPLOYEES E
JOIN (
SELECT DEPARTMENT_ID, COUNT(*) DEPT_COUNT
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID
HAVING COUNT(*) > 5
) DC ON E.DEPARTMENT_ID = DC.DEPARTMENT_ID
AND HIRE_DATE NOT LIKE '%JAN%'
Комментарии:
1. Я думаю, что объединенная таблица также должна иметь hire_date, не похожий на Jan, нет? В противном случае количество (*) будет включать сотрудников, нанятых в январе. Из вопроса не совсем ясно, должно ли количество включать всех сотрудников или сотрудников, не нанятых в январе, но интуитивно мне показалось, что, вероятно, следует исключить Jan hires для подсчета