我正在尝试运行一个查询,该查询加载了员工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语句来执行此操作,但是我无法使其正常工作。有什么想法吗?
答案 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
。