理解M语言

2020-02-11 16:04:31 浏览数 (1)

M语言介绍

M语言是Power Query的后台函数式编程语言,你在Power Query界面的操作过程都会记录下来并翻译成M语言。

Power Query上手十分容易,通过图形界面操作可以解决大部分需求,一般情况下,我们不用去深入学习M语言,但是,如果对M语言有了一定的理解可以对操作步骤进行优化,让其更加智能,同时也能解决一些图形界面操作不能完成的任务。

从空查询开始

选择获取数据=》空查询,然后打开高级编辑器,我们可以看到编辑器中已经有了一些字符,如下:

我们先把这些字符删除,从最简单的表达式开始。

最简单的表达式

删除后,我们在高级编辑器中输入1 1后,发现左下角并没有提示语法错误,如下:

点完成,发现PQ直接将计算结果显示出来了,你会发现,用M表达式其实十分简单,完全可以将PQ当计算器一样使用

如输入一个更复杂的表达式200*30^3 500*(6 3) 800/6

分步显示let

如果不考虑数据的存储引用形式,其实M表达式比EXCEL公式还要简单,这是由于M语言是支持分步书写,你可以随时返回查看每步的计算结果,对于理解整个表达式有很大的帮助。

但EXCEL公式并不支持分步,你想看EXCEL公式的部分计算结果,只能选择该部分公式,然后按F9,这对调试和理解复杂的EXCEL公式造成了很大的难度。

下面以计算个人所得税为例:

2019年个人所得税计算规则

如果用EXCEL公式:

代码语言:javascript复制
=IF((A1-B1-C1-D1-E1)>960000,(A1-B1-C1-D1-E1)*0.45-181920,
IF((A1-B1-C1-D1-E1)>660000,(A1-B1-C1-D1-E1)*0.35-85920,
IF((A1-B1-C1-D1-E1)>420000,(A1-B1-C1-D1-E1)*0.3-52920,
IF((A1-B1-C1-D1-E1)>300000,(A1-B1-C1-D1-E1)*0.25-31920,
IF((A1-B1-C1-D1-E1)>144000,(A1-B1-C1-D1-E1)*0.2-16920,
IF((A1-B1-C1-D1-E1)>36000,(A1-B1-C1-D1-E1)*0.1-2520,
IF((A1-B1-C1-D1-E1)>0,(A1-B1-C1-D1-E1)*0.03,0)))))))

当然也有优化后的数组公式:

代码语言:javascript复制
= MAX((A1-B1-C1-D1-E1)*{0.03,0.1,0.2,0.25,0.3,0.35,0.45}
-{0,210,1410,2660,4410,7160,15160}*12,0)

无论是第一个公式还是第二个公式,在阅读和理解上都十分不友好,特别是后期维护时还要十分小心,怕看错位了。

但如果用M表达式,则要好看很多,如下:(表达式没有实用意义,仅为了帮助理解M表达式)

代码语言:javascript复制
let
全年综合所得=200000,
专项扣除=6800,
专项附加扣除=4000,
其他扣除=2400,
免征额=60000,
应纳税所得额=全年综合所得-专项扣除-专项附加扣除-其他扣除-免征额,
全年应纳个人所得税= if  应纳税所得额<0 then
    应纳税所得额=0
    else
    if 应纳税所得额<=36000  then
    应纳税所得额*0.03
    else
    if  应纳税所得额<=144000 then
    应纳税所得额*0.1-2520
    else
    if  应纳税所得额<=300000 then
    应纳税所得额*0.2-16920
    else
    if  应纳税所得额<=420000 then
    应纳税所得额*0.25-31920
    else
    if  应纳税所得额<=660000 then
    应纳税所得额*0.3-52920
    else
    if  应纳税所得额<=960000 then
    应纳税所得额*0.35-85920
    else
    应纳税所得额*0.45-181920
in
全年应纳个人所得税

写入编辑器后,关键词高亮显示,阅读起来也比较容易,后期维护更改也会简单很多。

可能有人认为,这M表达式也好长啊。大多学习EXCEL公式的人都有一个倾向,如何把EXCEL公式写得越来越短,没错,这对学习EXCEL公式,训练自己的思维,有一定的好处,但如果用这种方法去学习M表达式则是不可取的

M表达式主要注重运算效率高,代码易于阅读,并且适当加入一些注释,便于后续维护。(事实上,EXCEL大多数看上去简短优化后的公式,在运行数据量大的时候效率十分低,因为很多时候把公式写短是用的数组公式,显然不适用于数据量大的情形。)

除书写上M表达式易于阅读外,PQ也给出了let内每个步骤的计算结果。如下:

我们可以随时回到前面某个步骤,如我们想查看应纳税所得额是多少,直接点击步骤 应纳税所得额 ,这就十分方便验证每个步骤是否正确,以及对各个步骤进行更改。不用像EXCEL公式那样要一气呵成。

关键字 in

let 与 in 是成对出现的,in就像很多编程语言中的return 即 in后面的表达式决定返回值是什么,如果你把公式 in 全年应纳个人所得税 改成 in 其他扣除, 那么最后返回值是 其他扣除 这个步骤变量的数值。

需要注意:每个步骤后面 用英文逗号(,)结尾,但在in前面的最后一个步骤,不能用逗号(,);如果in 后面引用的步骤变量不是最后一个,那么在“应用的步骤窗口”中不会将每个步骤列出来。

今天的分享就到这里,内容比较简单,主要对M语言进行了介绍,下次将进一步探讨M语言的其他内容。

—— End —

0 人点赞