сотрудник отдела мудрый и количество сотрудников более 5

#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 для подсчета