SQL-запрос необходим для статистики на основе 2 таблиц - PullRequest
0 голосов
/ 03 октября 2019

У меня есть таблица 1, как показано ниже:

create table table1
(
     empname varchar(10), 
     issue_no number
);

insert into table1(empname, issue_no) values('abc',123);
insert into table1(empname, issue_no) values('ijk',222);
insert into table1(empname, issue_no) values('abc',333);
insert into table1(empname, issue_no) values('abc',444);
insert into table1(empname, issue_no) values('kkk',555);
insert into table1(empname, issue_no) values('kkk',555);

Другая таблица emp_details, как

create table emp_details
(
     emp varchar2(10), 
     mgr varchar2(10)
);

insert into emp_details(emp) values('abc','xyz');
insert into emp_details(emp) values('ijk','xyz');
insert into emp_details(emp) values('kkk','lll');

Мне нужен запрос, который вернет первую строку менеджера и количество проблем вего / докладывает, а в более поздних строках сотрудник и количество их проблем.

Выходные данные таблицы должны быть такими:

        user | issue_count
        -----+-----------
        xyz     4
        abc     3
        ijk     1
        lll     2
        kkk     2

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

Ответы [ 2 ]

0 голосов
/ 03 октября 2019

Основная идея должна заключаться в построении иерархического запроса, который может быть выполнен с использованием такого условия union all на первом шаге (подзапрос) и в зависимости от логики, согласно которой каждый менеджер одновременно является сотрудником , а во втором запросе логика упорядочения подготавливается аналитической функцией dense_rank():

with e1 as
(
 select emp, mgr from
 (
  select distinct mgr as emp, null as mgr
    from emp_details
  union all  
  select emp, mgr
    from emp_details
  )
 connect by prior emp = mgr
), e2 as
(
select e.*, dense_rank() over (order by e.mgr desc) as dr, t.cnt 
  from e1 e left join (select emp, count(*) as cnt from table1 group by emp) t on t.emp=e.emp 
), e3 as
(
select 0 as emp_group, mgr as "user", count(*) as "issue count", max(dr) as dr
  from e2 group by mgr 
 union all  
select 1 as emp_group, emp, max(cnt), max(dr) from e2 group by emp
)
select "user", "issue count"
  from e3
 where "issue count" is not null and "user" is not null
 order by dr, emp_group;

user    issue count
-----   -----------
xyz      4
ijk      1
abc      3
lll      2
kkk      2

Демо

0 голосов
/ 03 октября 2019

Попробуйте, пожалуйста. Вам нужно две группы, простой и быстрый способ объединения

SELECT a.mgr, count(b.issue_no), min(b.issue_no) rn, 1 ord
 FROM emp_details a, table1 b 
    where a.emp = b.emp (+)
group by a.mgr
UNION ALL
SELECT b.emp, count(*), min(b.issue_no)rn, 2 ord
 FROM  table1 b
GROUP BY  b.emp 
order by rn, ord

ВЫХОД:

xyz 4   123 1
abc 3   123 2
ijk 1   222 2
lll 2   555 1
kkk 2   555 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...