sql - 基于 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
没有报告人的员工顺序可以是任何顺序。请注意缩进也是重要的,以找出经理及其报告人。
解决方案
主要思想应该是构建一个分层查询,可以通过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
推荐阅读
- python-3.x - 如何在 OpenCV 中为拼接多个图像腾出空间 - Python3
- c++ - 为什么 cuda 设备计数为零?
- sql-server - AWS:降级单个 EC2 实例的 Sql 许可证
- angular - 订阅()返回未定义
- angular - Angular 4 使用 ng-container 隐藏/显示
- javascript - 无法使用 django 实现隐藏和显示功能
- json - JQ 按键加入 JSON 文件
- amazon-web-services - 使用 AWS LEX 时,有没有办法获得多个意图(及其相关分数)?
- javascript - 带有重复文本的滚动选框
- javascript - 为什么我只有心跳?