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

Oracle查询:找出近1个月请假天数最多的员工

解决Oracle查询近1个月内请假天数最多员工的问题

看起来你现在的查询语句还没达到需求哦——原语句只是筛选出了请假开始时间在1个月之前的员工,但既没有计算每个员工的总请假天数,也没有找出天数最多的那一位。咱们来一步步修正这个问题:

第一步:明确需求范围

首先要确认“近1个月内”的定义:这里我们默认是指请假记录的开始时间在过去1个月内(也就是 STARTDATE BETWEEN ADD_MONTHS(SYSDATE, -1) AND SYSDATE),如果业务需求是“请假时间段有任意部分落在近1个月内”,可以调整条件,但先按常规场景处理。

正确的查询语句

场景1:如果有多个员工请假天数并列最多,全部显示

这种情况我们需要先统计每个员工的总请假天数,再筛选出等于最大天数的员工,最后关联员工表获取详细信息:

SELECT e.*, total_leave_days
FROM EMPLOYEE24 e
JOIN (
    -- 统计近1个月内每个员工的总请假天数
    SELECT EMPLOYEEID, SUM(NOOFDAYS) AS total_leave_days
    FROM LEAVE25
    WHERE STARTDATE >= ADD_MONTHS(SYSDATE, -1) -- 筛选近1个月内的请假记录
    GROUP BY EMPLOYEEID
    HAVING SUM(NOOFDAYS) = (
        -- 找出近1个月内的最大请假天数
        SELECT MAX(sum_days)
        FROM (
            SELECT SUM(NOOFDAYS) AS sum_days
            FROM LEAVE25
            WHERE STARTDATE >= ADD_MONTHS(SYSDATE, -1)
            GROUP BY EMPLOYEEID
        ) t
    )
) l ON e.EMPLOYEEID = l.EMPLOYEEID;

场景2:只需要显示任意一位请假天数最多的员工(比如按员工ID排序取第一个)

如果业务上只需要一个结果,可以用窗口函数简化:

SELECT *
FROM (
    SELECT e.*, SUM(l.NOOFDAYS) AS total_leave_days,
           RANK() OVER (ORDER BY SUM(l.NOOFDAYS) DESC) AS leave_rank
    FROM EMPLOYEE24 e
    LEFT JOIN LEAVE25 l ON e.EMPLOYEEID = l.EMPLOYEEID
    WHERE l.STARTDATE >= ADD_MONTHS(SYSDATE, -1)
    GROUP BY e.EMPLOYEEID, e.FIRSTNAME, e.LASTNAME, e.GENDER
) t
WHERE leave_rank = 1
FETCH FIRST 1 ROW ONLY; -- 如果要保留所有并列第一的员工,去掉这句即可

对原查询的问题分析

原语句 SELECT * FROM EMPLOYEE24 WHERE EMPLOYEEID IN (SELECT EMPLOYEEID FROM LEAVE25 WHERE STARTDATE < ADD_MONTHS(SYSDATE, -1)); 存在两个核心问题:

  • 条件 STARTDATE < ADD_MONTHS(SYSDATE, -1) 是找1个月之前开始的请假,和“近1个月内”的需求完全相反
  • 没有对请假天数进行求和统计,也没有筛选出天数最多的员工

内容的提问来源于stack exchange,提问作者Adwait Bembalkar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:04:12