列出该经理所在部门的 "manager's name" 和 "number of employees"

List the "manager's name" and the "number of employees" in that manager's department

“列出该经理所在部门的“经理姓名”和“员工人数””是我 class 的请求查询。我还不能嵌入图片,所以我会尽力在此处正确设置它们的格式

这是员工的一些数据table:

EMPNO---ENAME----JOB----------MGR----SAL---- DEPTNO

7839--- KING-----PRESIDENT---     ---5000-----10

7698----BLAKE----MANAGER-----7839----2850-----30

7782----CLARK----MANAGER-----7839----2450-----10

7566----JONES----MANAGER-----7839----2975-----20

7654----MARTIN---SALESMAN----7698----1250-----30

7499----ALLEN----SALESMAN----7698----1600-----30

7900----TURNER---SALESMAN----7698----1500-----30

7521----JAMES----CLERK-------7698----950------30

7902----WARD-----SALESMAN----7698----1250-----30

7902----FORD-----ANAYLYST----7566----3000-----20

我目前的代码是:

SELECT A.ENAME, COUNT(*)

FROM EMP A

JOIN EMP B

ON A.DEPTNO = B.DEPTNO

GROUP BY A.ENAME;

这段代码似乎给了我所有员工和他们部门的员工人数。从这个问题来看,我相信我只需要 3 名工作为 with job = 'MANAGER' 的员工。不幸的是,我不知道如何做到这一点,也不知道他们部门的员工人数是否正确。任何指导或帮助将不胜感激。

SELECT A.ENAME, COUNT(*) 
FROM EMP A 
   JOIN EMP B ON A.DEPTNO = B.DEPTNO 
WHERE A.JOB = 'MANAGER'
GROUP BY A.ENAME;

如有错误请指正

这很好,老斯科特的 EMP table。如果呈现为 ,它看起来像这样:

SQL> select lpad(' ', 2 * level) || ename hierarchy
  2  from emp
  3  connect by prior empno = mgr
  4  start with mgr is null;

HIERARCHY
--------------------------------------------------------------------------------
  KING
    JONES
      SCOTT
        ADAMS
      FORD
        SMITH
    BLAKE
      ALLEN
      WARD
      MARTIN
      TURNER
      JAMES
    CLARK
      MILLER

14 rows selected.

SQL>

显然,

  • King 是 Jones、Blake 和 Clark 的经纪人
  • 琼斯是斯科特和福特的经理
  • 斯科特是亚当斯的经理
  • 福特是史密斯的经理
  • 等等

Self-join 然后 returns

SQL> select m.ename, count(*)
  2  from emp e join emp m on m.empno = e.mgr
  3  group by m.ename
  4  order by count(*) desc;

ENAME        COUNT(*)
---------- ----------
BLAKE               5
KING                3
JONES               2
SCOTT               1
FORD                1
CLARK               1

6 rows selected.

SQL>

另一方面,如果您只想指定 MANAGERS 以及来自 DEPT table 的一些数据,您将再次需要 self-join(的EMP table),但这次它将是 OUTER JOIN,因为“运营”部门没有任何员工(也没有经理):

SQL> select d.dname, e.ename, count(e.rowid) cnt
  2  from dept d left join emp e on e.deptno = d.deptno
  3                             and e.job = 'MANAGER'
  4              left join emp m on e.deptno = m.deptno
  5  group by d.dname, e.ename;

DNAME          ENAME             CNT
-------------- ---------- ----------
RESEARCH       JONES               5
SALES          BLAKE               6
ACCOUNTING     CLARK               3
OPERATIONS                         0

SQL>

您可以使用分层查询(这将避免 self-join table)。

如果要全部统计部门中没有 MANAGER 工作的所有人员,则:

SELECT MAX(PRIOR ename) AS mgr_name,
       COUNT(*) AS num_employees
FROM   emp
WHERE  LEVEL = 2
START WITH job = 'MANAGER'
CONNECT BY NOCYCLE
       PRIOR deptno =  deptno
AND    PRIOR empno  <> empno
GROUP BY PRIOR empno

输出:

MGR_NAME NUM_EMPLOYEES
JONES 4
CLARK 2
BLAKE 5

如果要统计与经理在同一部门并由该经理管理的所有人员,则:

SELECT MAX(PRIOR ename) AS mgr_name,
       COUNT(*) AS num_employees
FROM   emp
WHERE  LEVEL = 2
START WITH job = 'MANAGER'
CONNECT BY PRIOR empno = mgr
GROUP   BY PRIOR empno

其中,对于 Scott 模式,输出:

MGR_NAME NUM_EMPLOYEES
JONES 2
CLARK 1
BLAKE 5

如果你想在没有分层查询的情况下进行,那么你可以使用:

SELECT MAX(m.ename) AS mgr_name,
       COUNT(*) AS num_employees
FROM   emp m
       INNER JOIN emp e
       ON (   m.deptno =  e.deptno
          AND m.empno  <> e.empno )
WHERE  m.job = 'MANAGER'
GROUP BY m.empno

SELECT MAX(m.ename) AS mgr_name,
       COUNT(*) AS num_employees
FROM   emp m
       INNER JOIN emp e
       ON (   m.deptno = e.deptno
          AND m.empno  = e.mgr )
WHERE  m.job = 'MANAGER'
GROUP BY m.empno

db<>fiddle here