MySQL关联生成员工月度工时报表时单ID数据异常问题
解决员工月度工时报表的SQL关联问题
嘿,我来帮你捋清楚这个问题出在哪~
首先你提到的问题根源,是没有正确建立两张表的关联关系:
- 当你写
ON e.emp_nr = 57时,这根本不是在关联employee和zeit表,而是把employee表中emp_nr=57的那条单独记录,和zeit表的所有记录做了笛卡尔积连接——相当于强制让这个员工的信息和每一条工时记录配对,结果里的name和emp_nr自然全是这个员工的,这完全不是你要的关联效果。 - 改成
ON a.emp_nr = 57时,只是筛选了zeit表中emp_nr=57的工时记录,但同样没把两张表的emp_nr字段关联起来,所以本质还是错误的连接逻辑,结果变化只是因为筛选的表变了而已。
正确的查询写法
要生成员工月度工时报表,你需要先通过两张表共有的emp_nr字段建立关联,再筛选目标员工和月份。这里给你两种常用的写法:
1. 基础明细查询(查看每日工时)
SELECT e.emp_nr, e.name, a.szeit AS start_time, a.ezeit AS end_time, TIMESTAMPDIFF(HOUR, a.szeit, a.ezeit) AS daily_work_hours FROM employee e INNER JOIN zeit a ON e.emp_nr = a.emp_nr -- 核心:两张表通过emp_nr关联 WHERE e.emp_nr = 57 -- 筛选目标员工 AND DATE_FORMAT(a.szeit, '%Y-%m') = '2024-09'; -- 替换成你要查询的年月
2. 月度总工时统计
如果需要直接计算该员工当月的总工时,可以用聚合函数:
SELECT e.emp_nr, e.name, SUM(TIMESTAMPDIFF(HOUR, a.szeit, a.ezeit)) AS total_monthly_hours FROM employee e INNER JOIN zeit a ON e.emp_nr = a.emp_nr WHERE e.emp_nr = 57 AND DATE_FORMAT(a.szeit, '%Y-%m') = '2024-09' GROUP BY e.emp_nr, e.name; -- 按员工分组聚合
关键提醒
INNER JOIN的ON子句首要作用是定义两张表的关联规则(也就是e.emp_nr = a.emp_nr),筛选条件(比如员工编号、月份)更适合放在WHERE子句里;如果一定要把筛选条件放在ON里,也必须保留关联规则,否则就会变成错误的笛卡尔积连接。
内容的提问来源于stack exchange,提问作者Frank Casser
相关产品推荐
相关产品推荐

