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

求修正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);

说明:

  1. 使用CASE语句精准判断:仅当日期在1-25日且出勤(Attendance=1)时计为1,否则为0
  2. 分组时加入YEAR(Date),避免跨年同月份的统计数据混淆
  3. ORDER BY保证结果按员工代码、月份顺序输出
  4. 如果需要包含所有员工的所有月份(即使当月无符合条件的出勤,显示0),需生成包含所有员工和所有月份的维度表,再与tblEmployee左关联后统计。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 19:55:48