首页 > 解决方案 > 基于 2 个表的统计信息需要 SQL 查询

问题描述

我有一个如下表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

没有报告人的员工顺序可以是任何顺序。请注意缩进也是重要的,以找出经理及其报告人。

标签: sqloracle

解决方案


主要思想应该是构建一个分层查询,可以通过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

Demo


推荐阅读