如何修改Power Query代码实现跨表双列匹配并提取CODE_T值
问题需求
现有两张输入表TblA和TblB:
- 当前代码已实现通过
TblA[NUM]匹配TblB[VALUES],获取对应的CODE_T值 - 需要修改
Table.AddColumn步骤,新增以下逻辑并合并结果:- 提取
TblA[STR]中的数字部分 - 将提取的数字按从右到左顺序拼接为新字符串
- 用该字符串匹配
TblB[CODE_M],获取对应结果 - 合并两类匹配的结果(过滤空值后合并)
- 提取
核心逻辑实现
1. 逆序数字提取的自定义函数
先封装提取并逆序拼接数字的逻辑,方便复用:
Get_Reverse_Number = (str as text) => let // 筛选字符串中的数字字符 numChars = List.Select(Text.ToList(str), each Value.Is(Value.FromText(_), type number)), // 逆序列表后拼接成字符串 reversedNum = Text.Combine(List.Reverse(numChars)) in reversedNum
2. 修改后的完整查询代码
将原匹配逻辑与新增逻辑整合,在Table.AddColumn中同时处理两类匹配并合并结果:
let Source = TblA, // 定义逆序数字提取函数 Get_Reverse_Number = (str as text) => let numChars = List.Select(Text.ToList(str), each Value.Is(Value.FromText(_), type number)), reversedNum = Text.Combine(List.Reverse(numChars)) in reversedNum, // 新增/修改列:合并两类匹配结果 Add_Combined_Results = Table.AddColumn(Source, "匹配结果", (row) => let // 原逻辑:NUM匹配VALUES获取CODE_T matchedCodeT = Table.SelectRows(TblB, each [VALUES] = row[NUM]), codeT = if Table.RowCount(matchedCodeT) > 0 then matchedCodeT{0}[CODE_T] else null, // 新增逻辑:STR逆序数字匹配CODE_M获取对应结果 reversedNum = Get_Reverse_Number(row[STR]), matchedCodeM = Table.SelectRows(TblB, each [CODE_M] = reversedNum), codeM = if Table.RowCount(matchedCodeM) > 0 then matchedCodeM{0}[CODE_M对应目标列] else null, // 替换为TblB中CODE_M关联的实际列名 // 合并结果:移除空值后用逗号分隔 combinedResult = Text.Combine(List.RemoveNulls({codeT, codeM}), ", ") in combinedResult ) in Add_Combined_Results
预期输出示例
假设TblA和TblB的测试数据如下:
TblA
| NUM | STR |
|---|---|
| 123 | AB45CD67 |
| 456 | XYZ89 |
| 789 | ABC |
TblB
| VALUES | CODE_T | CODE_M | CODE_M对应目标列 |
|---|---|---|---|
| 123 | T1 | 7654 | M7654 |
| 456 | T2 | 98 | M98 |
| 789 | T3 |
最终输出表:
| NUM | STR | 匹配结果 |
|---|---|---|
| 123 | AB45CD67 | T1, M7654 |
| 456 | XYZ89 | T2, M98 |
| 789 | ABC | T3 |
内容的提问来源于stack exchange,提问作者Rasec Malkic
相关产品推荐
相关产品推荐

