如何找到经理的总案例

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;