开启编辑栏:
在Power Query中,顶部的菜单栏提供了非常多的按钮,我们可以方便地使用图形化界面操作,而实际上每一个功能按钮背后即是一段代码,我们所熟悉的添加列、拆分列、合并查询等等都有其对应的M语言公式。
有些新手可能不知道公式在哪,因为PQ中编辑栏默认是关闭的,需要手动开启。
在视图界面,需要了解3个功能,最左边的查询设置控制最右边的步骤开关,有时候步骤找不到了需要点一下这里;编辑栏即上方输入公式的地方,此处为每一个步骤的公式;高级编辑器里的则是整个查询的公式。
输入步骤的公式需点击编辑栏中的fx按钮,有些人会误以为是在添加列-自定义列里写公式,而添加列功能对应的只是Table.AddColumn
,如果公式并不是要添加列那么请点fx。
查询与步骤的关系:
在可见的界面中,查询在最左边,步骤在最右边。每一个查询包含若干个步骤,步骤是查询的子集。但一般来说,每一个查询是一张表,每一个步骤也是一张表,这个怎么理解呢?
我们看一个案例:需要将两个表合并,你可能会把两个表分别创建一个查询,然后将两个查询使用合并查询功能,但实际上完全可以在一个查询里完成:
let 数量 = Excel.CurrentWorkbook(){[Name="数量"]}[Content], 单价 = Excel.CurrentWorkbook(){[Name="单价"]}[Content], 合并 = Table.NestedJoin(数量,{"产品"},单价,{"产品"},"a",JoinKind.LeftOuter), 展开 = Table.ExpandTableColumn(合并, "a", {"单价"}) in 展开
如果之前只用过图形界面操作,可能会陷入这样一个误区:步骤与步骤间存在关系,每个步骤只能继承上一个步骤。但从上面的案例中我们可以发现其中"数量"和"单价"这两个步骤之间并没有什么关系,完全是独立的。我们以为的步骤之间的关系,实际上只是公式中的表参数默认使用上一张表而已,你完全可以改成其他的。
该查询中包含了4个步骤,let和in是M语言中的固定语法,let表示代码的开始,其中每一个步骤即是一个独立的table,in表示最后要输出的结果。如果之前有python或者任何编程基础的话,可以这么理解,每一个步骤为一个变量,in即相当于将想要显示的变量结果print出来。
in后面可以是以上任意一个步骤名,也可以是一个公式,比如把上面的改写成:
let 数量 = Excel.CurrentWorkbook(){[Name="数量"]}[Content], 单价 = Excel.CurrentWorkbook(){[Name="单价"]}[Content], 合并 = Table.NestedJoin(数量,{"产品"},单价,{"产品"},"a",JoinKind.LeftOuter) in Table.ExpandTableColumn(合并, "a", {"单价"})
但一般来说in后面的都是最后一个步骤名。
基本语法:
- 以let开头,in结尾
- 步骤与步骤之间以逗号隔开,最后一个步骤也就是in之前不能加逗号
- 大小写敏感,函数名、变量名大小写不一致均会报错
- =前面的即为右侧看到的步骤名,=后面的即编辑栏看到的公式
- 单行注释为//,多行注释为/*..*/,注释不影响运行结果
嵌套:
同工作表函数一样,M语言也支持嵌套。比如上面的案例,可以嵌套写成:
let 合并 = Table.NestedJoin(Excel.CurrentWorkbook(){[Name="数量"]}[Content],{"产品"},Excel.CurrentWorkbook(){[Name="单价"]}[Content],{"产品"},"a",JoinKind.LeftOuter), 展开 = Table.ExpandTableColumn(合并, "a", {"单价"}) in 展开
只需要把"数量"和"单价"后面的公式复制,替换掉"合并"这个步骤中对应的"数量"和"单价"即可。
这很容易理解,这个是步骤的嵌套。再来看一个案例:
let 数量 = Excel.CurrentWorkbook(){[Name="数量"]}[Content], 单价 = let 源 = Excel.CurrentWorkbook(){[Name="单价"]}[Content] in 源, 合并 = Table.NestedJoin(数量,{"产品"},单价,{"产品"},"a",JoinKind.LeftOuter), 展开 = Table.ExpandTableColumn(合并, "a", {"单价"}, {"单价"}) in 展开
这又是什么鬼?怎么有两个let两个in???
前面说过,in输出查询中若干个步骤其中任一步骤,这个let in,也就等价于Excel.CurrentWorkbook(){[Name="单价"]}[Content]
,这个就是查询的嵌套,常用于自定义全局函数。
使用嵌套,能够减少冗余,使代码看起来更加简洁,但同时也增加了复杂度,不便于修改和维护,请根据实际情况适当使用。
请教一个问题,是否可以在查询中自动实现插入条件列(手动命名),然后该条件列名自动成为“应用的步骤”中的名称。
不能,步骤名只是一个形式上的命名,无论修改成什么都不影响计算结果,它不是值,不能引用
既然每一个步骤都是一张表,那么嵌套后减少了步骤,是否可以提高运行效率,或者减少内存使用量?
小白请教大神:PQ如何实现excel中的if+vlookup功能呢?大大的需要,求解答,感谢感谢!!