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 —