使用高级编辑器

开启编辑栏:

在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],这个就是查询的嵌套,常用于自定义全局函数。
使用嵌套,能够减少冗余,使代码看起来更加简洁,但同时也增加了复杂度,不便于修改和维护,请根据实际情况适当使用。

4 Replies to “使用高级编辑器”

  1. 请教一个问题,是否可以在查询中自动实现插入条件列(手动命名),然后该条件列名自动成为“应用的步骤”中的名称。

    1. 不能,步骤名只是一个形式上的命名,无论修改成什么都不影响计算结果,它不是值,不能引用

  2. 既然每一个步骤都是一张表,那么嵌套后减少了步骤,是否可以提高运行效率,或者减少内存使用量?

  3. 小白请教大神:PQ如何实现excel中的if+vlookup功能呢?大大的需要,求解答,感谢感谢!!

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注