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

如何创建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 08:52:32