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
相关产品推荐
相关产品推荐

