SQL WHERE子句冲突:如何实现全员工指定月度考勤报表展示
解决方案
要显示所有员工的月度考勤数据(包括当月无考勤记录的员工),核心是从员工表出发做左连接,并将日期筛选条件放在连接条件中而非WHERE子句,避免过滤掉无考勤的员工记录。
调整后的SQL语句
SELECT e.employee_id AS id, e.name, GROUP_CONCAT(mr.1) AS '1', GROUP_CONCAT(mr.2) AS '2', GROUP_CONCAT(mr.3) AS '3', GROUP_CONCAT(mr.4) AS '4', GROUP_CONCAT(mr.5) AS '5', GROUP_CONCAT(mr.6) AS '6', GROUP_CONCAT(mr.7) AS '7' FROM employee AS e LEFT JOIN monthly_report AS mr ON e.employee_id = mr.employee_id AND MONTH(mr.date_time) = '6' AND YEAR(mr.date_time) = '2023' GROUP BY e.employee_id, e.name
关键说明
- 以员工表为主表:从
employee表发起查询,确保所有员工都会被纳入结果集,无论是否有当月考勤记录。 - 日期条件移至
ON子句:若将日期筛选放在WHERE子句中,会自动过滤掉mr.date_time为NULL的记录(即无6月考勤的员工);放在ON子句中,只会影响左连接匹配的考勤数据,不会剔除主表的员工记录。 GROUP BY包含非聚合字段:多数SQL模式要求GROUP BY包含所有未使用聚合函数的SELECT字段,避免语法错误或结果异常。- 空值自定义显示(可选):如果希望无考勤的日期列显示特定文本(比如“未打卡”),可以用
IFNULL(GROUP_CONCAT(mr.1), '未打卡')替换原有的GROUP_CONCAT(mr.1)。
内容的提问来源于stack exchange,提问作者beta_tester
相关产品推荐
相关产品推荐

