Access交叉表查询:按用户与工作日汇总缺勤数据格式修正
我来帮你搞定这个Access交叉表查询的问题!要生成你要的用户×工作日的矩阵格式,我们需要调整TRANSFORM交叉表查询的结构,同时处理日期转换、空值和编码格式化的问题。
完整的修正查询
首先直接给你可以用的SQL语句,之后再拆解解释:
TRANSFORM First(IIf(IsNull(ta.TypeAbsenceCodeTemps), "", Format(ta.TypeAbsenceCodeTemps, "0000"))) AS AbsenceCode SELECT emp.EmployeeCiUsager AS Username FROM (tblAbsences AS abs INNER JOIN tlkpEmployee AS emp ON abs.EmployeeID = emp.EmployeeID) INNER JOIN tlkpTypeAbsence AS ta ON abs.TypeAbsenceID = ta.TypeAbsenceID WHERE Weekday(abs.AbsenceDateDébut) BETWEEN 2 AND 6 -- 只保留周一到周五的记录 GROUP BY emp.EmployeeCiUsager PIVOT WeekdayName(Weekday(abs.AbsenceDateDébut), False, 2) -- 转换为完整星期名称(周一到周五) IN ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'); -- 强制列的顺序
关键部分解释
关联表获取数据
我们把tblAbsences(缺勤记录)和tlkpEmployee(用户信息)、tlkpTypeAbsence(缺勤类型编码)关联起来,这样能拿到用户名和对应的缺勤编码。日期转星期名称
Weekday(abs.AbsenceDateDébut):返回日期对应的星期数值(Access默认周日=1,周一=2,周五=6),所以用BETWEEN 2 AND 6过滤掉周末。WeekdayName(..., False, 2):把数值转成完整的英文星期名称,第三个参数2指定周一为一周的第一天,确保返回Monday到Friday。
交叉表核心逻辑
TRANSFORM:定义每个单元格要显示的内容——用Format把编码转成4位字符串(比如1变成0001),用IIf和IsNull处理空值,没有记录时显示空字符串。First是聚合函数,确保同一天多个记录时取第一个编码(如果需要合并编码,得用自定义聚合函数,不过你的例子里是单个值,这个足够)。GROUP BY emp.EmployeeCiUsager:按用户名分组,保证每个用户只占一行。PIVOT ... IN (...):把星期名称转成列,IN子句强制列的顺序是周一到周五,避免Access自动排序打乱顺序。
扩展:显示所有用户(包括无缺勤的)
如果需要把没有任何缺勤记录的用户也显示出来,改成LEFT JOIN即可:
TRANSFORM First(IIf(IsNull(ta.TypeAbsenceCodeTemps), "", Format(ta.TypeAbsenceCodeTemps, "0000"))) AS AbsenceCode SELECT emp.EmployeeCiUsager AS Username FROM tlkpEmployee AS emp LEFT JOIN (tblAbsences AS abs INNER JOIN tlkpTypeAbsence AS ta ON abs.TypeAbsenceID = ta.TypeAbsenceID) ON emp.EmployeeID = abs.EmployeeID WHERE (abs.AbsenceDateDébut IS NULL) OR (Weekday(abs.AbsenceDateDébut) BETWEEN 2 AND 6) GROUP BY emp.EmployeeCiUsager PIVOT WeekdayName(Weekday(Nz(abs.AbsenceDateDébut, Date())), False, 2) IN ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday');
这个版本用LEFT JOIN关联用户表,确保所有用户都出现在结果里,WHERE子句允许没有缺勤记录的用户(abs.AbsenceDateDébut IS NULL)。
内容的提问来源于stack exchange,提问作者viRg
相关产品推荐
相关产品推荐

