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

Power Query跨表匹配带标识项目名并调和数据的高效月度方案咨询

两表项目匹配与数据调和高效实现方案

问题分析

你之前的公式返回全"No Match",是因为#"Table1"[PROJ]是引用Table1的整个PROJ列,而非当前行对应的匹配值,无法实现逐行匹配。以下是基于Power Query的高效解决方案,完全适配你的业务规则:

分步实现步骤

1. 预处理Table1:生成匹配用的标准项目名

为Table1添加标准项目名列,移除名称中的AB和DDPC标识,使其与Table2的项目名称格式统一:

// 为Table1添加标准项目名
Table1处理 = Table.AddColumn(Table1, "标准项目名", each Text.Replace(Text.Replace([项目名称], "AB", ""), "DDPC", ""))

随后重命名Table1的数值列避免冲突:

Table1处理 = Table.RenameColumns(Table1处理, {{"利润", "利润_T1"}, {"工时", "工时_T1"}, {"销售额", "销售额_T1"}})

2. 预处理Table2:重命名数值列

同样重命名Table2的数值列,方便后续计算:

Table2处理 = Table.RenameColumns(Table2, {{"利润", "利润_T2"}, {"工时", "工时_T2"}})

3. 合并两表并匹配数据

以Table2为主表,通过项目名称(Table2)和标准项目名(Table1)做左外连接,确保所有Table2的项目都能保留:

合并查询 = Table.NestedJoin(Table2处理, {"项目名称"}, Table1处理, {"标准项目名"}, "Table1数据", JoinKind.LeftOuter)

展开合并后的Table1数据列:

展开数据 = Table.ExpandTableColumn(合并查询, "Table1数据", {"利润_T1", "工时_T1", "销售额_T1"}, {"利润_T1", "工时_T1", "销售额_T1"})

4. 按规则计算最终列

根据业务规则生成最终的数值列:

  • 利润:取两表对应值的平均值
  • 工时:取两表对应值的和
  • 销售额:直接复用Table1的数值
计算最终列 = Table.AddColumn(展开数据, "利润", each ([利润_T2] + [利润_T1])/2)
计算最终列 = Table.AddColumn(计算最终列, "工时", each [工时_T2] + [工时_T1])
计算最终列 = Table.RenameColumns(计算最终列, {{"销售额_T1", "销售额"}})

5. 清理冗余列

删除不需要的中间列,保留最终需要的字段:

最终表 = Table.SelectColumns(计算最终列, {"项目名称", "利润", "工时", "销售额"})

完整可复用M代码

let
    // 处理Table1
    Table1处理 = 
        let
            源 = Table1,
            添加标准项目名 = Table.AddColumn(源, "标准项目名", each Text.Replace(Text.Replace([项目名称], "AB", ""), "DDPC", "")),
            重命名列 = Table.RenameColumns(添加标准项目名, {{"利润", "利润_T1"}, {"工时", "工时_T1"}, {"销售额", "销售额_T1"}}),
            保留必要列 = Table.SelectColumns(重命名列, {"标准项目名", "利润_T1", "工时_T1", "销售额_T1"})
        in
            保留必要列,

    // 处理Table2
    Table2处理 = 
        let
            源 = Table2,
            重命名列 = Table.RenameColumns(源, {{"利润", "利润_T2"}, {"工时", "工时_T2"}})
        in
            重命名列,

    // 合并与计算
    合并查询 = Table.NestedJoin(Table2处理, {"项目名称"}, Table1处理, {"标准项目名"}, "Table1数据", JoinKind.LeftOuter),
    展开数据 = Table.ExpandTableColumn(合并查询, "Table1数据", {"利润_T1", "工时_T1", "销售额_T1"}, {"利润_T1", "工时_T1", "销售额_T1"}),
    计算利润 = Table.AddColumn(展开数据, "利润", each ([利润_T2] + [利润_T1])/2),
    计算工时 = Table.AddColumn(计算利润, "工时", each [工时_T2] + [工时_T1]),
    整理销售额 = Table.RenameColumns(计算工时, {{"销售额_T1", "销售额"}}),
    清理列 = Table.SelectColumns(整理销售额, {"项目名称", "利润", "工时", "销售额"})
in
    清理列

补充说明

  • 如果存在匹配失败的项目,可在计算列中添加空值处理,例如利润列改为:each if [利润_T1] <> null then ([利润_T2] + [利润_T1])/2 else [利润_T2]
  • 该方案支持每月批量更新,只需替换Table1和Table2的数据源即可自动完成调和

内容的提问来源于stack exchange,提问作者myinnernerd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 03:25:22