如何创建MS Access透视查询:无匹配时返回默认值并显示全量数据
解决MS Access透视查询无法显示全量员工与技能的问题
问题根源是原查询直接基于技能等级表关联,仅返回存在等级记录的组合。要实现需求,需先生成所有员工×所有技能的全量组合,再左连接技能等级表填充默认值,最后执行透视。
步骤1:生成全量员工-技能组合
通过交叉连接得到每一位员工对应所有技能的完整配对:
SELECT e.EmployeeID, e.EmployeeName, s.SkillID, s.SkillName FROM Employee AS e CROSS JOIN SkillsList AS s
该查询会列出所有可能的员工-技能组合,不受是否有等级记录的限制。
步骤2:左连接技能等级表并填充默认等级
将全量数据集与技能等级表左连接,用Access专属的Nz()函数把空等级值替换为1:
SELECT base.EmployeeID, base.EmployeeName, base.SkillName, Nz(st.SkillLevel, 1) AS SkillLevel FROM ( -- 嵌入步骤1的全量组合查询 SELECT e.EmployeeID, e.EmployeeName, s.SkillName FROM Employee AS e CROSS JOIN SkillsList AS s ) AS base LEFT JOIN SkillsTable AS st ON base.EmployeeID = st.EmployeeID AND base.SkillName = st.SkillName
注意:若你的表用SkillID而非SkillName做关联标识,需同步替换连接条件中的对应字段。
步骤3:创建最终透视查询
基于步骤2的结果,用Access的TRANSFORM语句编写透视SQL:
TRANSFORM First(Nz(st.SkillLevel, 1)) AS SkillLevel SELECT base.EmployeeID, base.EmployeeName FROM ( SELECT e.EmployeeID, e.EmployeeName, s.SkillName FROM Employee AS e CROSS JOIN SkillsList AS s ) AS base LEFT JOIN SkillsTable AS st ON base.EmployeeID = st.EmployeeID AND base.SkillName = st.SkillName GROUP BY base.EmployeeID, base.EmployeeName PIVOT base.SkillName;
这个透视会以员工为行、技能为列展示数据,无对应等级记录的单元格自动显示1,完全覆盖所有员工与技能的组合。
额外提示
- 若员工表或技能列表存在重复记录,交叉连接会生成冗余数据,需先清理重复项再执行查询。
- 确保连接条件同时匹配员工和技能的唯一标识,避免关联错误。
内容的提问来源于stack exchange,提问作者David Winter
相关产品推荐
相关产品推荐

