You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

查询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;

代码解释:

  1. 先用WHERE筛选出2017年的所有服务记录
  2. 按Employee_ID分组,统计每个员工的服务次数COUNT(*)
  3. 按服务次数升序排序(最少的排在最前面)
  4. 用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;

代码解释:

  1. 先用CTE(公共表表达式)统计每个员工2017年的服务次数,同时用RANK()窗口函数给每个员工按服务次数排名(最少的排第1)
  2. 从统计结果里筛选出排名为1的员工,这样就能得到所有并列最少的员工

内容的提问来源于stack exchange,提问作者Raymundo Lopez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:41:56