题目描述
员工表:Employee`
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| employee_id | int |
| team_id | int |
+---------------+---------+
employee_id 字段是这张表的主键,表中的每一行都包含每个员工的 ID 和他们所属的团队。
编写一个 SQL 查询,以求得每个员工所在团队的总人数。
查询结果中的顺序无特定要求。
查询结果格式示例如下
Employee Table:
+-------------+------------+
| employee_id | team_id |
+-------------+------------+
| 1 | 8 |
| 2 | 8 |
| 3 | 8 |
| 4 | 7 |
| 5 | 9 |
| 6 | 9 |
+-------------+------------+
Result table:
+-------------+------------+
| employee_id | team_size |
+-------------+------------+
| 1 | 3 |
| 2 | 3 |
| 3 | 3 |
| 4 | 1 |
| 5 | 2 |
| 6 | 2 |
+-------------+------------+
ID 为 1、2、3 的员工是 team_id 为 8 的团队的成员,
ID 为 4 的员工是 team_id 为 7 的团队的成员,
ID 为 5、6 的员工是 team_id 为 9 的团队的成员。
基本思路:
(1)关联子查询
因为题目要求统计各个team的数量,因此考虑使用count()和group by来得到各个team的数量:
SELECT team_id,COUNT(team_id) AS team_size
FROM Employee
GROUP BY team_id
新的表和原表都有team_id,使用联结,根据team_id将两表合并
select e.employee_id, s.team_size
from Employee e left join (
select team_id,count(*) as team_size
from Employee group by team_id
)as s
on e.team_id=s.team_id;
(2)使用自身跟自身联结,然后通过分组得到每个team_id对应的team_size
select e1.employee_id, count(e1.employee_id) as team_size
from Employee e1 left join Employee e2
on e1.team_id=e2.team_id
group by e1.employee_id;