Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于2个表的统计数据所需的SQL查询_Sql_Oracle - Fatal编程技术网

基于2个表的统计数据所需的SQL查询

基于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

我有一个表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\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。