PowerBI公式-VAR

录音机

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我们一样可以完成工作,但这个函数我极力地推荐大家使用,只为更好。

本文分享自微信公众号 - PowerBI大师(PowerBIMaster),作者:马世权

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-06-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 上下文系列小讲堂(回顾1)

    创建行上下文 1. 计算列:引用原有列,通过计算生成新列 2. 迭代函数 1) 聚合函数+X结尾:SumX,AverageX,CountX,Counta...

    公众号PowerBI大师
  • 上下文系列小讲堂(一)

    “度量值”和“计算列”的区别,令很多初学新人纠结不已。毕竟大部份人是从EXCEL里绕过来的,遇到问题,习惯拉起公式添加列,操作近乎条件反射,毕竟添加的计算列实实...

    公众号PowerBI大师
  • 上下文系列小讲堂(四)

    很多人下意识地的在脑子里把客户ID和订单日期排序,再手工添加个递增填充列就完事——典型的Excel思路

    公众号PowerBI大师
  • JavaScript核心概念之执行上下文和栈

    现在想改变一下写作方式,以问答的形式来讲解这些枯燥无味的知识,尽量把每一个为什么都讲透,每个知识点都不迷惑。

    桃翁
  • 微信小程序|旋转动画效果

    在小程序中,如果可以用一个动画效果展现一句话或一段文字,会比普通文字呈现更具吸引力,这不仅是体现更多样的文字效果,更是突出这段文字的一个方法。那么接下来就来看一...

    算法与编程之美
  • Android版本占比情况反映出对TEE强大的需求

    Google Play每周发布一次的dashboards信息显示,Android各个版本目前的使用情况。之前9月份的Android主流版本为Android...

    安智客
  • Java|String、StringBuffer和StringBuilder的区别

    java.lang.String、java.lang.StringBuffer、java.lang.StringBuilder.

    算法与编程之美
  • [COM Interop学习小结]实现一个C#调用C++的示例

      最近在研究产品的架构代码,发现其中涉及到Com组件技术,即项目中的C# Project会通过Com接口来调用C++ Project中的方法,研究一下,实现一...

    宋凯伦
  • Android P 行为变更

    Android 开发者
  • Android Gradle插件中文指南

    最近想把Android项目从Eclipse迁到Android Studio上。原因呢,Eclipse太慢了,而且经常卡死,Android Studio由于And...

    飞雪无情

扫码关注云+社区

领取腾讯云代金券