想象一下,我有一张这样的表:
+----+--------+--------+------+
| ID | NAME | DEPTNO | MGR |
+----+--------+--------+------+
| 1 | AYEW | 10 | 4 |
| 2 | JORDAN | 20 | 4 |
| 3 | JAMES | 20 | 4 |
| 4 | MESSI | 30 | NULL |
+----+--------+--------+------+
我需要显示如下结果:
+----+---------+-------------+--------+-------+
| ID | MANAGER | SUBORDINATE | DEPTNO | COUNT |
+----+---------+-------------+--------+-------+
| 4 | MESSI | AYEW | 10 | 1 |
| 4 | MESSI | JORDAN | 20 | 2 |
| 4 | MESSI | JAMES | 20 | 2 |
+----+---------+-------------+--------+-------+
换句话说,我必须计算每个部门有多少下属得到每个经理,并且还要显示下属的名字和deptno。
我知道如何轻松地将经理和下属与JOIN联系起来,但问题在于计数列。如何按部门同时显示下属的总下属数?我假设我不能使用GROUP BY来计算每个部门的下属数量,所以我不知道如何做到这一点。
感谢mathguy的回答,也可以做第二次加入:
join original_table c on (e.deptno=c.deptno and e.mgr=c.mgr)
所以count列也会显示预期的结果。
答案 0 :(得分:2)
这是与分析功能的连接:
select m.id, m.name as manager, e.name as subordinate, e.deptno,
count(*) over (partition by m.id, e.deptno) as cnt
from emps e join
emps m
on e.mgr = m.id;
答案 1 :(得分:0)
不确定如何在内部实施分析功能 - Gordon的解决方案可能与以下完全相同。 (行的排序可能会有所不同 - 如果需要,可以添加一个显式的ORDER BY。)注意:我带头并将列命名为“count” - 通常最好避免,因为“count”是一个保留字(使用“ cnt“或类似的东西。”
select m.id, m.name, e.name, e.deptno, c.count
from emps e join emps m on e.mgr = m.id
join (select mgr,deptno, count(*) count from emps where mgr is not null
group by mgr, deptno) c
on e.mgr = c.mgr and e.deptno = c.deptno
SQL> /
ID NAME NAME DEPTNO COUNT
---------- ------ ------ ---------- ----------
4 MESSI JORDAN 20 2
4 MESSI JAMES 20 2
4 MESSI AYEW 10 1
3 rows selected.
Elapsed: 00:00:00.01