查询2017年服务量最少员工的SQL语句报错求助
修正你的SQL以找到2017年服务量最少的员工
咱们先拆解下你这段SQL里的几个核心问题,然后给出正确的写法:
原SQL的错误点
- 语法错误:子查询里用
AND连接表和筛选条件是完全错误的,应该用WHERE来指定年份筛选逻辑,原句FROM Service_Done AND year(Date_Serviced) = 2017不符合SQL语法规范。 - 逻辑错误:子查询同时返回
Grooming_ID和Count(Employee_ID),但主查询里用Employee_ID = (...)来匹配,数据类型和返回结果完全不匹配;而且你没有按Employee_ID分组,Count(Employee_ID)只会统计2017年所有服务记录的总数,不是单个员工的服务量。 - 缺失核心逻辑:你的SQL完全没有处理“找最少服务量”的逻辑,既没有分组统计每个员工的服务次数,也没有排序或取最小值的操作。
修正后的SQL写法
方法1:适合只返回一个最少服务量员工(如MySQL、SQLite)
如果只需要返回任意一个服务量最少的员工(即使有多个员工并列最少),可以用分组+排序+限制行数的方式:
SELECT Employee_ID, COUNT(*) AS Total_Services FROM Service_Done WHERE YEAR(Date_Serviced) = 2017 GROUP BY Employee_ID ORDER BY Total_Services ASC LIMIT 1;
代码解释:
- 先用
WHERE筛选出2017年的所有服务记录 - 按
Employee_ID分组,统计每个员工的服务次数COUNT(*) - 按服务次数升序排序(最少的排在最前面)
- 用
LIMIT 1取排序后的第一条记录
方法2:返回所有并列服务量最少的员工(通用多数数据库)
如果存在多个员工服务量相同且都是最少的,想要把他们都找出来,可以用窗口函数(支持PostgreSQL、SQL Server、MySQL 8.0+等):
WITH Employee_Service_Stats AS ( SELECT Employee_ID, COUNT(*) AS Total_Services, RANK() OVER (ORDER BY COUNT(*) ASC) AS Service_Rank FROM Service_Done WHERE YEAR(Date_Serviced) = 2017 GROUP BY Employee_ID ) SELECT Employee_ID, Total_Services FROM Employee_Service_Stats WHERE Service_Rank = 1;
代码解释:
- 先用CTE(公共表表达式)统计每个员工2017年的服务次数,同时用
RANK()窗口函数给每个员工按服务次数排名(最少的排第1) - 从统计结果里筛选出排名为1的员工,这样就能得到所有并列最少的员工
内容的提问来源于stack exchange,提问作者Raymundo Lopez
相关产品推荐
相关产品推荐

