我将所有员工(经理和员工)放在一张名为“员工”的表下。表如下所示,
+-------+------------+---------+---------+------------+
|emp_id | name | dept_id | salary | manager_id |
+=======+============+=========+=========+============+
| 1 | Sally | 1 | 20000 | null |
| 2 | Ajit | 2 | 20000 | 1 |
| 3 | Rahul | 1 | 20000 | 1 |
| 4 | uday | 1 | 20000 | null |
| 5 | john | 1 | 20000 | null |
| 6 | netaji | 2 | 20000 | 2 |
| 7 | prakriti | 3 | 1111 | 3 |
| 8 | sachin | 3 | 1111 | 3 |
| 9 | santosh | 1 | 1111 | 2 |
| 10 | Ravi | 1 | 1111 | 2 |
+-------+------------+---------+---------+------------+
Run Code Online (Sandbox Code Playgroud)
经理和员工都属于同一张表。manager_id 指= emp_id 是经理。
我想编写查询来计算属于每个经理的员工数量。因此,即使某个经理手下没有任何员工,计数也会显示为 0
结果应如下所示,
+------+----------+
|Count | Manager |
+======+==========+
| 2 | Sally |
| 3 | Ajit |
| 2 | Rahul |
| 0 | Uday |
| 0 | John |
+------+----------+
Run Code Online (Sandbox Code Playgroud)
您需要在桌子上进行左自连接。左连接将确保每个经理都有一行,即使他们下面没有员工。如果经理没有员工,您需要COUNT()在联接的员工端的字段上使用聚合。实际上并不计算 NULL,因此这应该在您想要的地方给出零。NULLCOUNT()
此查询中的子句WHERE通过查看经理是否manager_id为 NULL 或者连接表中是否有任何匹配项来定义经理,这意味着有人将他们设置为经理。
SELECT mgr.name, COUNT(emp.emp_id) AS employee_count
FROM Employee AS mgr
LEFT JOIN Employee AS emp ON emp.manager_id=mgr.emp_id
WHERE mgr.manager_id IS NULL OR emp.emp_id IS NOT NULL
GROUP BY mgr.name
Run Code Online (Sandbox Code Playgroud)