570. Managers with at Least 5 Direct Reports
Problem Description
Table: Employee
+-------------+----------+
| Column Name | Type |
+-------------+----------+
| id | int |
| name | varchar |
| department | varchar |
| managerId | int |
+-------------+----------+
id is the primary key column for this table.
Each row of this table indicates the name of an employee, their department, and the id of their manager.
If managerId is null, then the employee does not have a manager.
No employee will be the manager of themselves.
Write an SQL query to report the managers with at least 5 direct reports.
Return the result table in any order.
Example:
Input:
Employee table:
+-----+-------+------------+-----------+
| id | name | department | managerId |
+-----+-------+------------+-----------+
| 101 | John | A | null |
| 102 | Dan | A | 101 |
| 103 | James | A | 101 |
| 104 | Amy | A | 101 |
| 105 | Anne | A | 101 |
| 106 | Ron | B | 101 |
+-----+-------+------------+-----------+
Output:
+------+
| name |
+------+
| John |
+------+
Solution
MySQL Solution
SELECT e1.name
FROM Employee e1
JOIN (
SELECT managerId
FROM Employee
WHERE managerId IS NOT NULL
GROUP BY managerId
HAVING COUNT(*) >= 5
) e2
ON e1.id = e2.managerId;
Alternative Solution:
SELECT name
FROM Employee
WHERE id IN (
SELECT managerId
FROM Employee
WHERE managerId IS NOT NULL
GROUP BY managerId
HAVING COUNT(*) >= 5
);
PostgreSQL Solution
SELECT e1.name
FROM Employee e1
INNER JOIN (
SELECT managerId
FROM Employee
WHERE managerId IS NOT NULL
GROUP BY managerId
HAVING COUNT(*) >= 5
) e2
ON e1.id = e2.managerId;
MS SQL Server Solution
SELECT name
FROM Employee
WHERE id IN (
SELECT managerId
FROM Employee
WHERE managerId IS NOT NULL
GROUP BY managerId
HAVING COUNT(*) >= 5
);
Oracle Solution
SELECT e1.name
FROM Employee e1
JOIN (
SELECT managerId
FROM Employee
WHERE managerId IS NOT NULL
GROUP BY managerId
HAVING COUNT(*) >= 5
) e2
ON e1.id = e2.managerId;
Approach Explanation
The solution uses SQL aggregation and joins:
- Key Insights:
- Group by manager
- Count direct reports
- Join for names
- Filter results
- Algorithm Steps:
- Group employees
- Count reports
- Filter count >= 5
- Get manager names
Implementation Details:
- Subquery usage
- JOIN operation
- GROUP BY clause
- HAVING clause
Optimization Insights:
- Index usage
- Join efficiency
- Subquery optimization
- Filter placement
Edge Cases:
- No managers
- NULL values
- Exactly 5 reports
- Multiple managers