"列出";经理的名字";以及";雇员人数";在经理的部门";是为我的类请求的查询。我还不能嵌入图片,所以我会尽我所能让它们在这里正确格式化
以下是员工表中的一些数据:
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>
另一方面,如果您只想指定MANAGERS
和DEPT
表中的一些数据,您将再次需要(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_NAME NUM_EMPLOYEES 琼斯 4 CLARK 2 BLAKE 5