列出该经理所在部门的 "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
“列出该经理所在部门的“经理姓名”和“员工人数””是我 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