SQL计算组中显示每个元素和总计数的某些元素

时间:2016-04-05 16:11:43

标签: sql oracle

想象一下,我有一张这样的表:

+----+--------+--------+------+
| 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列也会显示预期的结果。

2 个答案:

答案 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