如何关联表实现员工培训模块完成与未完成情况报表?
生成员工培训模块完成/未完成报表的SQL方案
核心思路
要覆盖所有员工的全部培训模块(含未完成项),关键是先构建「员工-模块」的全量组合,再匹配已完成记录:
- 用
Staff表和Modules表做交叉连接,生成每个员工对应所有模块的基础数据集; - 左连接
Completions表匹配已完成的记录,未匹配到的即为未完成项; - 通过条件判断将未完成项的完成日期设为空、状态设为0。
SQL示例(适配常见表结构)
假设表字段如下:
Staff:staff_id(员工ID)、manager_id(主管ID)、staff_name(员工姓名)Modules:module_id(模块ID)、module_name(模块名称)Completions:staff_id、module_id、completion_date(完成日期)、status(完成状态,1=已完成)
SELECT s.staff_id, s.staff_name, m.module_id, m.module_name, -- 未完成项显示空日期 c.completion_date, -- 未完成项状态设为0,已完成项保留原状态 CASE WHEN c.status IS NOT NULL THEN c.status ELSE 0 END AS completion_status FROM -- 若需筛选特定主管的下属,可在此加WHERE s.manager_id = '目标主管ID' Staff s -- 生成所有员工与所有模块的全组合 CROSS JOIN Modules m -- 左连接完成表,匹配已完成记录 LEFT JOIN Completions c ON s.staff_id = c.staff_id AND m.module_id = c.module_id -- 可选:按员工、模块排序,方便查看 ORDER BY s.staff_id, m.module_id;
关键细节说明
- CROSS JOIN:这是获取未完成项的核心,仅通过
Staff和Completions关联只能得到已完成模块,交叉连接能补全所有员工的所有模块条目; - LEFT JOIN:确保所有「员工-模块」组合都被保留,已完成的条目会带出
Completions表的日期和状态,未完成的则对应字段为NULL; - CASE语句:将未完成项的状态统一转换为0,完全匹配需求的报表格式。
内容的提问来源于stack exchange,提问作者user18612109
相关产品推荐
相关产品推荐

