Оцените количество сотрудников от высокого до низкого для каждого менеджера - PullRequest
1 голос
/ 08 июля 2019

Я искал похожие вопросы здесь о таком вопросе: Перечислите количество сотрудников для каждого менеджера и оцените количество сотрудников, подчиняющихся каждому менеджеру по убыванию.

Но я еще не нашел решение для моего. Мой код, как показано ниже. Любая помощь или предложения будут высоко оценены. (вопрос просил использовать ранжирование, но я не использовал rank () в моем коде)

SELECT m.first_name, 
       m.last_name as name, 
       count(e.employee_id) as count
FROM RITDB_employee e
INNER JOIN RITDB_manager m ON e.manager = m.employee_id
GROUP BY m.name
ORDER BY m.count

Ответы [ 3 ]

1 голос
/ 08 июля 2019

Попробуйте это:

SELECT m.first_name, 
       m.last_name as name, 
       count(e.employee_id) as count
FROM RITDB_employee e
INNER JOIN RITDB_manager m ON e.manager = m.employee_id
GROUP BY m.name
ORDER BY count(e.employee_id) desc

Также небольшой совет для вас, вы можете лучше написать полное имя таблицы для удобства проверки вместо того, чтобы давать имена.

1 голос
/ 08 июля 2019

Вы можете комбинировать оконные функции и GROUP BY.Функция окна будет оцениваться после группировки .Кроме того, вам необходимо включить first_name и last_name в условие group by:

SELECT m.first_name, 
       m.last_name as name, 
       count(*) as count, 
       dense_rank() over (order by count(*) desc partition by m.first_name, m.last_name) as rnk
FROM RITDB_employee e
  JOIN RITDB_manager m ON e.manager = m.employee_id
GROUP BY m.last_name, m.first_name
ORDER BY count(*) desc
0 голосов
/ 08 июля 2019

Похоже, вы на правильном пути - единственное, чего вам не хватает, это ранжировать менеджеров по количеству сотрудников, которые у вас уже есть.Как вы уже догадались, функция rank может сделать это точно, хотя вы можете предпочесть использовать dense_rank, если у вас есть связи и вы хотите убедиться, что ряды непрерывны:

SELECT   name, cnt, DENSE_RANK() OVER (ORDER BY cnt DESC) AK rank_by_employee_num
FROM     (SELECT     m.first_name || ' ' || m.last_name as name, 
                     COUNT(e.employee_id) AS cnt
          FROM       RITDB_employee e
          INNER JOIN RITDB_manager m ON e.manager = m.employee_id
          GROUP BY   m.first_name || ' ' || m.last_name) t
ORDER BY cnt DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...