在单个 SQL 查询中汇总多个 table 的计数

Summarize count of multi table in single SQL query

我有三个 table,详细信息如下:

Table 1: 工作日志

+-----------+------------+-------------+
| worklogid | technician | description |
+-----------+------------+-------------+
| 1         | john       | some text   |
+-----------+------------+-------------+
| 2         | jack       | some text   |
+-----------+------------+-------------+
| 3         | john       | some text   |
+-----------+------------+-------------+
| 4         | jenifer    | some text   |
+-----------+------------+-------------+

Table 2: 任务

+--------+-------+-------------+
| taskid | owner | description |
+--------+-------+-------------+
| 1      | john  | some text   |
+--------+-------+-------------+
| 2      | john  | some text   |
+--------+-------+-------------+
| 3      | john  | some text   |
+--------+-------+-------------+
| 4      | jack  | some text   |
+--------+-------+-------------+

Table 3: 请求

+-----------+------------+-----------+-------------+
| requestid | technician | title     | description |
+-----------+------------+-----------+-------------+
| 1         | john       | some text | ...         |
+-----------+------------+-----------+-------------+
| 2         | sara       | some text | ...         |
+-----------+------------+-----------+-------------+
| 3         | john       | some text | ...         |
+-----------+------------+-----------+-------------+
| 4         | jack       | some text | ...         |
+-----------+------------+-----------+-------------+

现在我需要SQL查询这个结果:

+------------+------------------+---------------+------------------+
| technician | count(worklogid) | count(taskid) | count(requestid) |
+------------+------------------+---------------+------------------+
| john       | 2                | 3             | 2                |
+------------+------------------+---------------+------------------+
| jack       | 1                | 1             | 1                |
+------------+------------------+---------------+------------------+
| jenifer    | 1                | 0             | 0                |
+------------+------------------+---------------+------------------+
| sara       | 0                | 0             | 1                |
+------------+------------------+---------------+------------------+

我该怎么办?

一种方法是只使用 union all 和聚合:

select techician, sum(is_workid), sum(is_taskid), sum(is_requestid)
from ((select technician, 1 as is_workid, 0 as is_taskid, 0 as is_requestid
       from worklog
      ) union all
      (select owner, 0, 1, 0
       from task
      ) union all
      (select technician, 0, 0, 1
       from request
      )
     ) t
group by technician;

在Postgres中,加入前也可以聚合:

select *
from (select technician, count(*) as num_workid
      from worklog
      group by technician
     ) w full join
     (select owner as technician, count(*) as num_task
      from task
      group by owner
     ) t
     using (technician) full join
     (select technician, count(*) as num_request
      from request
      group by technician
     ) w 
     using (technician);

有了 full join,我发现 usingon 更简单。但所有表中的名称必须相同。