如何找到经理的总案例
How would one find the total cases by manager
我有两张表:一张有案例以及解决这些案例的员工,另一张有员工的信息,包括他们的经理。我想查询每个经理下的案例数量。目前我的查询看起来像这样
select m.id, COUNT(distinct case when e.manager_id = m.id and a.resolver_id = e.id then a.ticket_id ELSE NULL END)
from tickets a
left join employee_info e on a.resolver_id= e.id
join employee_info m on e.manager_id = m.id
group by m.id
这个查询只统计了一个经理手下的直属员工,并没有统计所有员工(包括直接向经理汇报的人)。我将如何调整我的查询以包括一个人下的所有员工?
编辑
所以这是我的表格外观的混淆示例
Ticket_id resolver_id
0001 11
0002 11
0003 13
0004 13
0005 12
0006 19
Id manager_id
11 01
12 01
13 11
19 12
这就是我想要的结果
Id count
01 6
11 4
12 2
13 2
19 1
您实际上有一个 "tree" 名员工,并且想要递归遍历它。这就是递归 CTE 的用途。
我们将定义一个 "subordinate" cte,它将告诉我们所有员工之间的所有 "subordinate relationships",包括 "multi-level" 从属关系。如果A是B的经理,B是C的经理,那么A有下属B和C。
首先,我们从所有员工都是他们自己的下属开始。这是非递归部分。
SELECT id AS id1, id AS id2
FROM employee
然后,我们"expand one level down"从属关系。如果 B 是 A 的下属,则所有以 B 为经理的员工也是 A 的下属。id1 保持原样,id2 成为 "lower" 员工的 ID。这是递归部分。
SELECT s.id1, e.id
FROM subordinate s
JOIN employee e ON s.id2 = e.manager_id
然后我们将两者都放在递归 CTE 中。 Postgres 将根据需要多次迭代第二部分,直到没有新行被添加。这样我们就递归遍历了整个员工树。
WITH RECURSIVE subordinate AS (
SELECT id AS id1, id AS id2
FROM employee
UNION
SELECT s.id1, e.id
FROM subordinate s
JOIN employee e ON s.id2 = e.manager_id
)
select * from subordinate order by id1, id2;
我们来看看结果:
id1 | id2
-----+-----
1 | 1
1 | 11
1 | 12
1 | 13
1 | 19
11 | 11
11 | 13
12 | 12
12 | 19
13 | 13
19 | 19
看起来很棒! 1 每个人都是下属。 11有11和13,13和19等最底层的员工只有自己
一旦我们完成了这个,剩下的就很简单了。
我们可以做另一个 CTE,计算每位员工已解决的工单:
SELECT resolver_id as id, COUNT(*) as count
FROM tickets
GROUP BY resolver_id
然后我们将所有内容都粘贴到最终查询中。对于每个员工,将其所有下属的已解决计数相加。
WITH RECURSIVE subordinate AS (
SELECT id AS id1, id AS id2
FROM employee
UNION
SELECT s.id1, e.id
FROM subordinate s
JOIN employee e ON s.id2 = e.manager_id
),
resolved as (
SELECT resolver_id as id, COUNT(*) as count
FROM tickets
GROUP BY resolver_id
)
SELECT s.id1, SUM(r.count)
FROM subordinate s
JOIN resolved r ON r.id = s.id2
GROUP BY s.id1;
我有两张表:一张有案例以及解决这些案例的员工,另一张有员工的信息,包括他们的经理。我想查询每个经理下的案例数量。目前我的查询看起来像这样
select m.id, COUNT(distinct case when e.manager_id = m.id and a.resolver_id = e.id then a.ticket_id ELSE NULL END)
from tickets a
left join employee_info e on a.resolver_id= e.id
join employee_info m on e.manager_id = m.id
group by m.id
这个查询只统计了一个经理手下的直属员工,并没有统计所有员工(包括直接向经理汇报的人)。我将如何调整我的查询以包括一个人下的所有员工?
编辑
所以这是我的表格外观的混淆示例
Ticket_id resolver_id
0001 11
0002 11
0003 13
0004 13
0005 12
0006 19
Id manager_id
11 01
12 01
13 11
19 12
这就是我想要的结果
Id count
01 6
11 4
12 2
13 2
19 1
您实际上有一个 "tree" 名员工,并且想要递归遍历它。这就是递归 CTE 的用途。
我们将定义一个 "subordinate" cte,它将告诉我们所有员工之间的所有 "subordinate relationships",包括 "multi-level" 从属关系。如果A是B的经理,B是C的经理,那么A有下属B和C。
首先,我们从所有员工都是他们自己的下属开始。这是非递归部分。
SELECT id AS id1, id AS id2
FROM employee
然后,我们"expand one level down"从属关系。如果 B 是 A 的下属,则所有以 B 为经理的员工也是 A 的下属。id1 保持原样,id2 成为 "lower" 员工的 ID。这是递归部分。
SELECT s.id1, e.id
FROM subordinate s
JOIN employee e ON s.id2 = e.manager_id
然后我们将两者都放在递归 CTE 中。 Postgres 将根据需要多次迭代第二部分,直到没有新行被添加。这样我们就递归遍历了整个员工树。
WITH RECURSIVE subordinate AS (
SELECT id AS id1, id AS id2
FROM employee
UNION
SELECT s.id1, e.id
FROM subordinate s
JOIN employee e ON s.id2 = e.manager_id
)
select * from subordinate order by id1, id2;
我们来看看结果:
id1 | id2
-----+-----
1 | 1
1 | 11
1 | 12
1 | 13
1 | 19
11 | 11
11 | 13
12 | 12
12 | 19
13 | 13
19 | 19
看起来很棒! 1 每个人都是下属。 11有11和13,13和19等最底层的员工只有自己
一旦我们完成了这个,剩下的就很简单了。
我们可以做另一个 CTE,计算每位员工已解决的工单:
SELECT resolver_id as id, COUNT(*) as count
FROM tickets
GROUP BY resolver_id
然后我们将所有内容都粘贴到最终查询中。对于每个员工,将其所有下属的已解决计数相加。
WITH RECURSIVE subordinate AS (
SELECT id AS id1, id AS id2
FROM employee
UNION
SELECT s.id1, e.id
FROM subordinate s
JOIN employee e ON s.id2 = e.manager_id
),
resolved as (
SELECT resolver_id as id, COUNT(*) as count
FROM tickets
GROUP BY resolver_id
)
SELECT s.id1, SUM(r.count)
FROM subordinate s
JOIN resolved r ON r.id = s.id2
GROUP BY s.id1;