从PowerQuery转SQL:如何按顺序执行系列数据转换命令?
PowerQuery顺序式系列转换构建指南
先抓底层逻辑
- 每一步只干一件事,别在一个步骤里同时加字段、连表、分组,不然出问题根本找不到哪错了
- 死磕「上一步输出=当前步输入」,比如步骤2必须用步骤1的结果,步骤3用步骤2的,绝对不能跳步引用原始表
- 给每个步骤起人话名字,比如叫「加字段x」「连Table2」,别用系统默认的「已添加自定义」,回头看根本记不清干啥的
按目标倒推+顺向落地
1. 先画最终表的样子
先把你要的最终字段列出来(比如你示例里的agg(a), agg(b), agg(c), x, agg(T2.y), T3.z),倒推每一步要做啥:
- 最后一步是连Table3拿z,那上一步必须是分组后的表
- 分组的输入得是连完Table2的表
- 连Table2的输入得是加了x的表
- 最开始就是原始Table1
2. 对应你的示例一步步来
不管用可视化界面还是写M代码,按顺序走:
- 步骤1:加载源表
直接导入Table1,保留a、b、c,命名「源表Table1」 - 步骤2:加字段x
选「源表Table1」,加自定义列生成x(比如x=a+b),命名「加字段x」,结果列:a,b,c,x - 步骤3:左连Table2
选「加字段x」,左连Table2,选好关联键(比如a),只保留T2的y列,命名「连Table2」,结果列:a,b,c,x,T2.y - 步骤4:按x分组聚合
选「连Table2」,按x分组,给a、b、c、T2.y设好聚合规则(比如求和),命名「按x分组」,结果列:agg(a),agg(b),agg(c),x,agg(T2.y) - 步骤5:左连Table3
选「按x分组」,左连Table3,匹配对应键,保留T3的z列,命名「连Table3」,拿到最终表
3. 偷懒又高效的技巧
- 用高级编辑器写M代码时,直接用
let-in结构,每一行对应一个步骤,自动继承上一步的结果,比如:let 源表Table1 = Table.FromRecords({[a=1,b=2,c=3], [a=4,b=5,c=6]}), 加字段x = Table.AddColumn(源表Table1, "x", each [a]+[b]), 连Table2 = Table.NestedJoin(加字段x, {"a"}, Table2, {"a"}, "Table2", JoinKind.LeftOuter), 展开T2y = Table.ExpandTableColumn(连Table2, "Table2", {"y"}, {"T2.y"}), 按x分组 = Table.Group(展开T2y, {"x"}, {{"agg(a)", each List.Sum([a])}, {"agg(b)", each List.Sum([b])}, {"agg(c)", each List.Sum([c])}, {"agg(T2.y)", each List.Sum([T2.y])}}), 连Table3 = Table.NestedJoin(按x分组, {"x"}, Table3, {"x"}, "Table3", JoinKind.LeftOuter), 展开T3z = Table.ExpandTableColumn(连Table3, "Table3", {"z"}, {"T3.z"}) in 展开T3z - 可视化操作时,每做完一步就看「应用步骤」面板,顺序错了直接拖改,某步错了直接右键编辑,不用从头再来
4. 避坑提醒
- 连表时必须保证关联键的类型一致,比如都是数字,一个文本一个数字绝对匹配不上
- 分组时别用默认的计数,要明确每个字段的聚合方式(求和/平均/最大值)
- 没用的列及时删,不然数据量越大越卡
内容的提问来源于stack exchange,提问作者overhear
相关产品推荐
相关产品推荐

