Найти manager_id с большинством людей под наблюдением - PullRequest
0 голосов
/ 15 октября 2018

У меня проблемы с отображением большинства людей в категории manager_id.Ответ manager_id = 100, но я не могу сделать SQL, который отображает его.Ниже приведены 2 таблицы, которые были созданы и предоставлены мне.

CREATE TABLE departments
    ( department_id    NUMBER(4)
    , department_name  VARCHAR2(30)
    CONSTRAINT  dept_name_nn  NOT NULL
    , manager_id       NUMBER(6)
    , location_id      NUMBER(4)
    ) ;

CREATE TABLE employees
    ( employee_id    NUMBER(6)
    , first_name     VARCHAR2(20)
    , last_name      VARCHAR2(25)
     CONSTRAINT     emp_last_name_nn  NOT NULL
    , email          VARCHAR2(25)
    CONSTRAINT     emp_email_nn  NOT NULL
    , phone_number   VARCHAR2(20)
    , hire_date      DATE
    CONSTRAINT     emp_hire_date_nn  NOT NULL
    , job_id         VARCHAR2(10)
    CONSTRAINT     emp_job_nn  NOT NULL
    , salary         NUMBER(8,2)
    , commission_pct NUMBER(2,2)
    , manager_id     NUMBER(6)
    , department_id  NUMBER(4)
    , CONSTRAINT     emp_salary_min
                     CHECK (salary > 0) 
    , CONSTRAINT     emp_email_uk
                     UNIQUE (email)
    ) ;

Ниже приведен мой код, в котором я пытаюсь соединить две таблицы employees и departments вместе, чтобы найти manager_id между ними с наибольшим количеством случаев.

Каждый разЯ пытаюсь запустить свой блок sql, он выдает ошибку типа "ORA-00918: column ambiguously defined" или что-то не так с Limit 1

SELECT COUNT(Manager_id) into v_manager_id, 
FROM departments d
RIGHT JOIN employees e
ON d.manager_id = e.manager_id
GROUP BY Manager_id
ORDER BY COUNT(Manager_id) DESC
LIMIT 1;

Ответы [ 3 ]

0 голосов
/ 16 октября 2018

Я думаю, вам нужно добавить квалификатор к manager_id, потому что это происходит в обеих таблицах

SELECT COUNT(d.Manager_id) into v_manager_id, 
FROM departments d
RIGHT JOIN employees e
ON d.manager_id = e.manager_id
GROUP BY d.Manager_id
ORDER BY COUNT(d.Manager_id) DESC
LIMIT 1;
0 голосов
/ 16 октября 2018

это будет работать:

select manager_id 
from (select manager_id,count(*)  
      from employees  
      group by manager_id 
      order by 
      count(*) desc)
where rownum<=1 ;

Вы также можете использовать вложенный подзапрос, например:

create table ns_231(col1 number,col2 number);

insert into ns_231 values(1,1);
insert into ns_231 values(2,3);
insert into ns_231 values(3,3);
insert into ns_231 values(1,2);
insert into ns_231 values(2,5);
insert into ns_231 values(2,1);
insert into ns_231 values(3,1);
insert into ns_231 values(1,4);

SELECT * FROM ns_231;
commit;
select col1 from (select col1,count(*) from ns_231  group by col1 order by count(*) desc) where rownum<=1 ;

select col1 from ns_231 group by col1
having count(*)=(select max(total) from (select count(*) as total from 
ns_231 group by col1));

вывод:

1
2

для вашей таблицы запросэто:

select manager_id from employees group by manager_id
having count(*)=(select max(total) from (select count(*) as total from 
employees group by manager_id));
0 голосов
/ 16 октября 2018

Вам лучше выбрать count (employee_id) ... group by manager_id, чтобы для всех сотрудников, находящихся под каким-либо менеджером, отображалось это количество, а затем проверьте, является ли это число максимальным для этого менеджера или нет, иначе это псевдоним или проблема с квалификаторомВы должны назвать manager_id как псевдоним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...