如何通过SQL查询全月缺勤人员及其对应薪资信息
整月全缺勤员工及对应薪资查询实现方案
前提表结构约定
默认两张业务表包含以下核心字段,可根据实际表结构调整:
SALARY_MONTH(月度薪资表):emp_id(员工唯一ID)、salary_month(薪资归属月份,格式示例2024-05)、salary(月度薪资额),可按需扩展员工姓名、部门等字段absent(缺勤记录表):emp_id(员工唯一ID)、absent_date(缺勤日期,日期类型)、absent_code(缺勤类型编码)
实现逻辑说明
- 针对同员工同天可能存在多条不同编码缺勤记录的问题,统计缺勤天数时对缺勤日期去重,避免计数错误
- 匹配月度薪资表的对应周期数据,保证薪资和缺勤记录属于同一核算月份
- 筛选出员工当月缺勤天数等于当月总天数的记录,即为整月全缺勤的人员
具体SQL实现(MySQL语法为例)
-- 设定要查询的目标核算月份,可按需修改 SET @target_month = '2024-05'; -- 计算目标月份的总自然天数 SET @month_total_days = DAY(LAST_DAY(@target_month)); SELECT s.emp_id, s.salary_month, s.salary FROM SALARY_MONTH s INNER JOIN ( -- 统计每个员工当月的去重缺勤天数 SELECT emp_id, DATE_FORMAT(absent_date, '%Y-%m') AS absent_month, COUNT(DISTINCT absent_date) AS absent_days FROM absent WHERE DATE_FORMAT(absent_date, '%Y-%m') = @target_month GROUP BY emp_id, DATE_FORMAT(absent_date, '%Y-%m') ) a ON s.emp_id = a.emp_id AND s.salary_month = a.absent_month WHERE a.absent_days = @month_total_days;
场景调整说明
- 若仅需统计工作日全缺勤,可提前维护一张工作日历表,关联后统计当月工作日总数,将过滤条件替换为缺勤天数等于当月工作日总数即可
- 若两张表的月份字段存储格式为每月第一天的日期类型(如
2024-05-01),调整对应日期格式化函数匹配字段格式即可 - 若存在员工当月薪资表无记录的场景,将
INNER JOIN改为LEFT JOIN并补充薪资字段非空过滤即可
内容的提问来源于stack exchange,提问作者Tick _Tack
相关产品推荐
相关产品推荐

