计算其他列中ID的出现次数

时间:2019-07-23 23:22:40

标签: sql

我正在尝试运行一个查询,该查询加载了员工ID,他们的经理(从CEO到直接主管),然后是其报告组中的人数(他们直接或间接监督的人员)。我已经弄清楚如何做的第一部分,加载员工ID和经理层次结构。

为简化我的问题,假设我创建的表如下所示:

EMPL_ID    MGR_1    MGR_2
001        001      
002        001      
003        001      002
004        001      002
005        001      002
006        001
007        001      006

因此MGR_1是最高管理者(我的实际数据集具有成千上万的行,并且管理者一直到MGR_10,但是这个简单的例子应该是说明性的)。我想要的最终结果将是:

EMPL_ID    MGR_1    MGR_2    REP_GRP
001        001               7
002        001               3
003        001      002      0
004        001      002      0
005        001      002      0
006        001               1
007        001      006      0

因此REP_GRP是向EMPL_ID指定的人员报告的员工数。

我尝试使用子查询和case语句来执行此操作,但是我无法使其正常工作。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

您可以尝试以下代码。可能会有更好的解决方案,但这就是我在旅途中可能想到的。

this._student.next(val)

答案 1 :(得分:0)

类似

SELECT empl_id, mgr_1, mgr_2,
       CASE WHEN empl_id = mgr_1 THEN
             (SELECT count(*) FROM employees AS e2 WHERE e.empl_id = e2.mgr_1)
            ELSE
             (SELECT count(*) FROM employees AS e2 WHERE e.empl_id = e2.mgr_2)
       END AS rep_grp
FROM employees AS e
ORDER BY empl_id;

给出

EMPL_ID     MGR_1       MGR_2       rep_grp
----------  ----------  ----------  ----------
001         001                     7
002         001                     3
003         001         002         0
004         001         002         0
005         001         002         0
006         001                     1
007         001         006         0

但是,这不是用于层次结构的最佳数据库设计。您最好只跟踪直接经理,并使用递归CTE计算此类数字。示例:

给出如下表格:

EMPL_ID     mgr_id
----------  ----------
001
002         001
003         002
004         002
005         002
006         001
007         006

使用空mgr_id值表示顶级经理(因为他们不向任何人报告),类似这样的查询:

SELECT empl_id, mgr_id,
   (WITH RECURSIVE reports AS
     (SELECT e2.* FROM employees AS e2 WHERE e2.mgr_id = e.empl_id
      UNION ALL
      SELECT e2.*
      FROM employees AS e2
      JOIN reports AS r ON e2.mgr_id = r.empl_id)
    SELECT count(*) FROM reports) AS rep_grp
FROM employees AS e
ORDER BY empl_id;

生成报告到的数字:

EMPL_ID     mgr_id      rep_grp
----------  ----------  ----------
001                     6
002         001         3
003         002         0
004         002         0
005         002         0
006         001         1
007         006         0

(6个而不是7个,因为同样,顶级经理不向任何人,甚至不向自己报告)

答案 2 :(得分:0)

我认为您只想要一个相关的子查询:

select t.*,
       (select count(*)
        from t t2
        where t2.empl_id <> t2.mgr1 and
              t.empl_id in (t2.mgr1, t2.mgr2)
       ) as rep_grp
from t;

请注意,这给最高级别的经理6分,而不是7分。我认为将该人视为自己的雇员是没有道理的。

如果要用7代替6,请删除t2.empl_id <> t2.mgr1