Найти отдел с максимальным количеством сотрудников в Oracle SQL - PullRequest
1 голос
/ 16 марта 2019

У меня есть эти две таблицы, и мне нужно найти название отдела с максимальным количеством сотрудников.

Другие решения были не для Oracle, поэтому я публикую этот вопрос. Кроме того, было бы очень полезно, если бы запрос мог быть подробно объяснен, так как мне трудно его визуализировать.

EMPLOYEE

EMPNO EMPNAME MANAGER SALARY DEPT_NO
1     Puja    6       30000  2
2     Purabi  1       15000  3
3     Barun   6       23000  2
4     Sudha   1       20000  1
5     Amal    2       20000  1
6     Rakesh  3       30000  4

DEPARTMENT

Dept_No Dept_Name  Location
1       Production LaneA
2       Marketing  LaneB
3       Sales      LaneC
4       HR         LaneD

До сих пор мне удавалось получить наибольшее количество сотрудников. Поэтому я подумал, можно ли как-нибудь написать еще один подзапрос, в котором я снова подсчитываю сотрудников в отделах и сравниваю их с max_num_emp, который я вычислил в первом запросе.

Это запрос, который извлекает максимальное количество сотрудников. Не возвращает dept_no.

select count(dept_no)
from employee
group by dept_no
order by count(dept_no) desc
fetch first row only;

Ожидаемый результат

DEPT_NAME
Production
Marketing

Я также могу добавить столбец dept_no в запрос, тогда мне придется каким-то образом выяснить, как получить максимум, и это как-то выдавало мне ошибки, потому что запрос нарушал некоторые правила. Я действительно пытался выполнить max ( над запросом ).

Поэтому я подумал о том, чтобы просто получить максимальное количество сотрудников, а затем определить все отделы, в которых работает такое количество сотрудников, и отобразить их имя.

Ответы [ 3 ]

3 голосов
/ 16 марта 2019

У вас есть рабочий запрос, который нужно присоединить к таблице department:

select d.Dept_Name   
from department d inner join (
  select dept_no
  from employee
  group by dept_no
  order by count(*) desc
  fetch first row only
) t
on t.dept_no = d.dept_no

РедактироватьПопробуйте это (я не могу попробовать):

select d.dept_name 
from department d inner join (
  select x.dept_no from (
    select dept_no, rank() over (order by count(*) desc) rn
    from employee
    group by dept_no
    order by count(dept_no) desc
  ) x
  where x.rn = 1
) t
on t.dept_no = d.dept_no
2 голосов
/ 16 марта 2019

Возможно, вы использовали FETCH..FIRST синтаксис, используя WITH TIES вместо ONLY.

SELECT d.dept_name
  FROM department d 
   JOIN employee e ON d.dept_no = e.dept_no
GROUP BY d.dept_name
ORDER BY COUNT(*) 
DESC FETCH FIRST 1 ROW WITH TIES ;

Демо

0 голосов
/ 16 марта 2019

Если вы не ищете дубликаты, то:

select d.dept_name, count(*)
from department d join
     employee e
     on d.dept_no = e.dept_no
group by d.dept_no, d.dept_name
order by count(dept_no) desc
fetch first row only;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...