求修正SQL查询:按员工代码统计月度符合规则的出勤天数
问题:按规则统计员工每月有效出勤天数
需求说明
基于员工代码统计每个员工每月符合以下规则的出勤天数:
- 每月1日至25日期间出勤(
Attendance=1),计1天 - 每月26日至月末期间出勤,不计入统计
最终输出格式如下:
1001 Jan 2 1001 Feb 1 1001 Mar 0 1001 Apr 2
现有数据表结构及数据
数据表tblEmployee结构与示例数据:
Emp_Code Date Attendance 1001 2023-01-01 1 1001 2023-01-02 1 1001 2023-01-03 1 1001 2023-01-04 1 1001 2023-01-05 0 1001 2023-01-06 0 1001 2023-01-07 1 1001 2023-01-08 1 ... 1002 2023-01-01 1 1002 2023-01-02 0 1002 2023-01-03 1 ... 1003 2023-01-01 1
其中Attendance为布尔列,0代表缺勤,1代表出勤。
原SQL问题
原查询统计的是出勤总天数,未按日期规则过滤:
SELECT Emp_Code,MAX(DATENAME(MM,Date)) AS MonthWisePresentOrAbsent, COUNT(1) AS "DaysAbsent" FROM tblEmployee GROUP BY MONTH(Date),Emp_Code;
修正后的SQL
核心逻辑:先标记符合日期规则的出勤记录,再按员工+月份分组求和:
SELECT Emp_Code, DATENAME(MM, Date) AS Month, SUM(CASE WHEN DAY(Date) BETWEEN 1 AND 25 AND Attendance = 1 THEN 1 ELSE 0 END) AS Valid_Attendance_Days FROM tblEmployee GROUP BY Emp_Code, YEAR(Date), MONTH(Date), DATENAME(MM, Date) ORDER BY Emp_Code, MONTH(Date);
说明:
- 使用
CASE语句精准判断:仅当日期在1-25日且出勤(Attendance=1)时计为1,否则为0 - 分组时加入
YEAR(Date),避免跨年同月份的统计数据混淆 ORDER BY保证结果按员工代码、月份顺序输出- 如果需要包含所有员工的所有月份(即使当月无符合条件的出勤,显示0),需生成包含所有员工和所有月份的维度表,再与
tblEmployee左关联后统计。
内容的提问来源于stack exchange,提问作者JParmar
相关产品推荐
相关产品推荐

