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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:04:13