PowerBI公式-VAR

2019-08-07 10:58:55 浏览数 (3)

录音机

VAR是单词Variables的缩写,即变量。Rob Collie把它比作录音机,这个比喻非常形象,录制好某一段落,再使用,而且是像复读机一样可以重复多次的播放出来。推荐学习这个函数的原因是它简单好学,在应用中有四大突出好处,更简洁的书写,替代Earlier,避免上下文的干扰,运算性能。本文将一一详细讲解,当你仔细读完这篇文章,很有可能对这个函数欲罢不能。

更简洁的书写

就以DAX官网的例子来讲解说明,求年比年环比增长率,我们知道公式逻辑是(当年销售量-上年同期销售量)/上年同期销售量。如果都放在一个公式里面的话,你一般会这样写:

可是这样不可避免的问题就是要重复的写同一类函数,而且也不便于阅读。用VAR可以很好的解决这个问题:

VAR的工作原理是它先录制一个变量,再配合使用Return把录制好的内容拿出来反复多次利用。这个例子中有两个小细节,注意第二个VAR引用了上一个VAR定义的Sales,也就是说VAR可以引用之前定义好的VAR;第二个细节是在PowerBI公式栏中输入的时候,智能提示会特别提醒你使用已经定义好的VAR,极大地方便了你的书写。

所以,VAR的第一个好处就是使你的书写更整洁,尤其在公式很臃肿的时候。

替代Earlier

第二大好处是大多数的情况它可以替代前面学习的Earlier公式,比如我们在学习Earlier时曾经用了一个求顺序计数的例子:

用Earlier来写第几次购买的公式:

现在学会了VAR,可以先把Earlier引用的列用VAR来定义:

两个公式输出的结果是一样的。这里的VAR工作过程是它先识别了行上下文(即当前行)中的顾客名字和索引,并记录下来结果,然后在Return的公式中引用,达到了与Earlier相同的效果。其实,在工作中我个人还是习惯于使用Earlier,不过有很多人对Earlier公式学习非常困惑,对于这部分人群,掌握VAR不失为一个很好的替换方案。

避免上下文的干扰

在理解上下文的学习中我们曾对比过下图中的两个公式,Filter中使用度量值和直接写公式的效果有可能是不同的,因为会涉及到上下文的转换,这个概念在课程中也多次强调,行上下文不会自动转换成筛选上下文,如果需要转换,须使用Calculate,并且要注意度量值是外套了隐藏的Calculate。

(如果对这两个公式有疑惑,请参看之前发过的文章理解上下文)在这个公式中,如果使用VAR先定义好SUM,再套用到Filter当中:

结果会与使用SUM的效果是一样的。

这个原理是VAR先录制好了当前上下文的SUM('销售数据表'[数量])的输出结果,再应用到Return后面的Filter公式中。也就是说VAR不会受到Filter创造的行上下文影响,而是充分发挥了录音机的效果,前面录制了什么,后面就原封不动的放出来。

如果你在前面学习中对上下文转换和隐藏Calculate的概念有点烦恼,使用VAR会感到清净了很多。

再来看个例子,我们想要计算超过总销售量5%的门店的销售量是多少,如果不用VAR,你需要这样写:

蓝色部分ALL函数的意思是排除Filter创造的行上下文影响来求得所有门店的销售量。也就是说当你在写蓝色公式部分的时候要考虑Filter上下文的影响,排除干扰后再求得想要的销售量。即使我经常写DAX公式,在思考这种逻辑时也要小心翼翼,怕掉到上下文的坑里。如果用VAR来写呢?看一下下面的公式:

明显逻辑更清楚整洁,这里的Five是在Filter外计算的,先求得当前上下文的5%销售量是多少并存储下来,再在Filter中拿出来使用,很好地避免了Filter上下文的干扰。

运算性能

关于运算性能的表现,这与为什么要用录音机的道理是一样的。录制好的东西可以拿出来反复播放,省去了你重复的工作。在DAX公式工作的过程中,VAR定义的运算会执行一次,Return后面即使多次引用,它会直接获取前面运算的存储结果,而不会重新执行计算。这相当于大大优化了DAX公式的运算性能,更快的完成工作。

基于上面的四大好处,没有用过VAR的你,有点心动了吧。虽然没有VAR我们一样可以完成工作,但这个函数我极力地推荐大家使用,只为更好。

0 人点赞