在Count聚合函数上使用Min聚合函数的SQL查询问题求助
解决获取员工数最少部门信息的SQL问题
首先,你遇到的语法错误是因为派生表(子查询)没有指定别名——大多数SQL数据库(比如SQL Server、MySQL等)要求FROM子句里的子查询必须有一个别名,否则会报语法错误。
先修正你原来的“获取最小员工数”的查询(仅获取数值):
SELECT MIN(mycount) FROM ( select D.DeptID, count(E.EmployeeID) as mycount from Employees as E right join Departments as D on D.DeptID = E.DeptID group by D.DeptID ) AS dept_counts; -- 这里添加了别名dept_counts
但你真正需要的是员工数最少的部门的完整信息,我给你两种可行的解决方案:
方法一:子查询+关联统计
先通过子查询算出全局最小的员工数,再在主查询中筛选出员工数等于这个最小值的部门:
SELECT D.DeptID, D.Dept, COUNT(E.EmployeeID) AS TotalStaff FROM Employees AS E RIGHT JOIN Departments AS D ON D.DeptID = E.DeptID GROUP BY D.DeptID, D.Dept HAVING COUNT(E.EmployeeID) = ( SELECT MIN(mycount) FROM ( SELECT COUNT(E.EmployeeID) AS mycount FROM Employees AS E RIGHT JOIN Departments AS D ON D.DeptID = E.DeptID GROUP BY D.DeptID ) AS dept_counts );
方法二:窗口函数(更简洁)
如果你的数据库支持窗口函数(比如SQL Server 2008+、MySQL 8.0+、PostgreSQL等),可以用CTE(公共表表达式)结合窗口函数,一次性计算出每个部门的员工数和全局最小员工数,再筛选结果:
WITH dept_staff_counts AS ( SELECT D.DeptID, D.Dept, COUNT(E.EmployeeID) AS TotalStaff, MIN(COUNT(E.EmployeeID)) OVER () AS MinStaffCount FROM Employees AS E RIGHT JOIN Departments AS D ON D.DeptID = E.DeptID GROUP BY D.DeptID, D.Dept ) SELECT DeptID, Dept, TotalStaff FROM dept_staff_counts WHERE TotalStaff = MinStaffCount;
这两种方法都会正确返回所有员工数最少的部门(包括像Production、Sales这种员工数为0的部门),和你最初的统计逻辑保持一致。
内容的提问来源于stack exchange,提问作者MarkusMulholland
相关产品推荐
相关产品推荐

