统计员工上月请假次数并更新到employee表的SQL代码问题求助
原有代码问题梳理
- 仅实现了请假数据查询逻辑,未执行
employee表更新操作,无法将统计结果写入目标表 - 使用
INNER JOIN关联两张表,上月无请假记录的员工会被过滤,无法覆盖全量员工 - 日期筛选存在跨年漏洞:若当前为1月,上月为去年12月,仅筛选年份等于当前年的规则会遗漏所有去年12月的请假记录
实现方案
表结构说明
现有employee、leave两张表,leave表包含leave_date字段,表结构如下:
更新语句(直接执行即可完成统计+更新)
假设employee表中存储上月请假数量的字段为last_month_leaves,可根据实际表结构调整字段名:
UPDATE e SET e.last_month_leaves = ISNULL(l.leave_count, 0) FROM employee e LEFT JOIN ( SELECT [employee id], COUNT(*) AS leave_count FROM leave -- 整月区间筛选,规避跨年问题,同时支持命中leave_date索引 WHERE leave_date >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 1, 0) AND leave_date < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) GROUP BY [employee id] ) l ON e.[employee id] = l.[employee id]
数据核对语句(可先运行验证统计结果是否正确)
SELECT e.[employee id], ISNULL(l.leave_count, 0) AS 上月请假次数 FROM employee e LEFT JOIN ( SELECT [employee id], COUNT(*) AS leave_count FROM leave WHERE leave_date >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 1, 0) AND leave_date < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) GROUP BY [employee id] ) l ON e.[employee id] = l.[employee id]
注意事项
- 若数据库大小写敏感,需保证
[employee id]字段名的写法在两张表中完全一致 - 若
leave表存在作废请假记录,可在子查询的WHERE条件中新增对应状态的过滤规则
内容的提问来源于stack exchange,提问作者Krati Garg
相关产品推荐
相关产品推荐

