基于2个表的统计数据所需的SQL查询
我有一个表1,如下所示:基于2个表的统计数据所需的SQL查询,sql,oracle,Sql,Oracle,我有一个表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
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\u详细信息
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
没有任何报告的雇员的顺序可以是任何顺序。请注意,缩进也是计算管理器及其报告的重要工具 请试试这个。您需要两个分组,以简单快捷的方式通过联合
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
其主要思想应该是构造一个分层查询,该查询可以通过在第一步(子查询)中使用这样一个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
几个小时前,有人在这里问了一个非常类似的问题。看看你能不能找到它。(也许有人上过同一门课?)。我的问题是,如果我们有两个表,如何编写查询。@SubhashTiwari。这需要递归CTE或分层查询。您使用的是哪一版本的Oracle?上面的查询没有给出正确的输出:MGR COUNT(*)xyz 1 lll 2 ijk 1 abc 3 kkk 2 xyz应该有4,而且它们显示的顺序也不是预期的。报告对象应显示在经理下方。您好,这里的订购人是一个问题。ijk位于managerxyz之下,所以它应该在abc之前或之后显示在xyz之下。由于相同的列名emp,我在理解这个查询时有点困惑。我已将表1中的第一个列名重命名为empname。您现在可以帮助我理解查询吗?您知道我们正在通过emp列连接表(其中一个是empname。顺便说一句,我更喜欢使用数字值,例如ID)。我们知道,每个经理都是员工,在您的案例中,经理没有管理他们的经理。因此,我首先在普通员工中应用union all,他们的经理在同一行,经理别名为employee,经理为null managers@SubhashTiwari。