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



"列出";经理的名字";以及";雇员人数";在经理的部门";是为我的类请求的查询。我还不能嵌入图片,所以我会尽我所能让它们在这里正确格式化

以下是员工表中的一些数据:

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名员工,他们的职位="经理"。不幸的是,我不知道如何做到这一点,也不知道他们部门的员工人数。任何指导或帮助都将不胜感激。

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

如果我错了,请纠正我。

这是一个很好的老斯科特EMP表。如果显示为,它看起来像这样:

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>

显然,

金是琼斯、布莱克和克拉克的经纪人
  • 琼斯是斯科特和福特的经理
  • 斯科特是亚当斯的经理
  • 福特是史密斯的经理
  • 等等
  • 自加入然后返回

    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>
    

    另一方面,如果您只想指定MANAGERSDEPT表中的一些数据,您将再次需要(EMP表的)自联接,但这次将是OUTER join,因为department"操作";没有任何员工(也没有经理):

    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>
    

    您可以使用分层查询(这样可以避免自联接表)。

    如果你想把部门里所有没有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_NAMENUM_EMPLOYEES
    琼斯4
    CLARK2
    BLAKE5

    相关内容

    • 没有找到相关文章

    最新更新