数据可视化之DAX篇(八) DAX学习:使用VAR定义变量

https://zhuanlan.zhihu.com/p/64414205

前面介绍如何使用DAX生成日期表的时候,使用了VAR,有人留言问这个VAR怎么理解,那么这篇文章就来介绍VAR以及它的用法。

 

VAR是VARIABLE的缩写,意思为变量,任何一个编程语言中,变量都是一个非常重要的基础概念,DAX当然也是一种语言,也有变量这个概念。如果以前学过编程,对这个应该很熟悉;没学过也没有关系,看了本文你就理解了。

 

我们人都有记忆能力,电脑也有记忆能力,并且比人的记忆能力更强大更稳定,那么如何利用电脑的记忆能力呢,就是利用变量。

 

变量就是可以改变的量,比如把当天日期定义为一个变量,那么通过这个变量电脑就记住了今天是4月29号,到了明天就变成4月30号了。

通过变量可以随心所欲的控制电脑的记忆,需要了就用,用完了可随时丢开,再想使用了再拿过来。

与变量想对应的就是常量,比如新中国成立日期是1949年10月1日,就是一个常量,电脑中定义以后,无论时光怎么流逝,电脑中这个记忆都不会改变。

在DAX中,就是通过VAR来控制电脑的记忆的。

 

VAR语法

 

VAR的语法规范很简单,就是把一个表达式定义为一个名称,

VAR 变量名=表达式

 

其中变量名不能和模型中现有的表名、字段名相同,也不能使用数字作为第一个字符,不能使用空格等,这个不用刻意记,如果提示变量名不符合规范,重新命名一下就是了。

定义变量是为了使用,是要返回结果的,这个操作由RETURN来完成,具体使用方式,看下面的示例。

 

VAR使用示例

 

假如有一个产品销售数据,现在计算每种产品的同比增长率,如果不使用VAR,我们可能是这样来计算的,

 

1,新建度量值,

 

[Sales]=SUM(销售表[销售额])

 

2,计算去年销售额,

 

[Saleslastyear]=CALCULATE([Sales],SAMEPERIODLASTYEAR(日期表[日期])

 

3,计算同比增长率

 

[YoY%]=DIVIDE([Sales]-[Saleslastyear],[Saleslastyear])

 

而使用VAR,新建一个度量值就可以搞定:

 

[YoY%]=
VAR Sales=SUM(销售表[销售额])
VAR Saleslastyear=
CALCULATE(SUM(销售表[销售额]),SAMEPERIODLASTYEAR(日期表[日期])
RETURN
DIVIDE(Sales-Saleslastyear,Saleslastyear)

 

这个度量值先定义一个变量“Sales”,然后再定义第二个变量的时候,两个变量定义完成后,返回两个变量相除的结果。

 

如果把这个度量值放入到上下文中,比如当前上下文为产品甲,电脑中会先记住产品甲的“Sales”,然后记住产品甲的“Saleslastyear”,最后通过RETURN后面的表达式,调用上面的记忆,执行运算,得到产品甲的同比增长率。

 

通过这个例子可以看出,VAR可以简化度量值的书写,并便于理解。并且它完成运算以后结果就被电脑记忆下来,需要时可以随时调用,而无需重新运算,大大提升了DAX的运算性能。

它还有一个小功能就是替代EARLIER函数。

 

替代EARLIER函数

 

在之前介绍EARLIER函数的时候,曾举了一个计算累计销量的例子,

 

 

用的是下面的DAX编写的新建列:

 

SUMX (FILTER('订单表',[序号]<=EARLIER([序号])&&
[产品名称]=EARLIER([产品名称])),[销售数量])

 

现在用VAR可以这样写:

 

VAR Index=[序号]
VAR ProductID=[产品名称]

RETURN
CALCULATE(SUM([销售数量]),filter('订单表',
[序号]<=Index&&[产品名称]=ProductID))

 

可以返回同样的结果,比EARLIER更易于理解。

上一篇文章中生成日期表的DAX,其中有两种方式也是综合使用VAR的例子,再仔细看一遍也可以加深对VAR的理解。

posted @ 2020-04-30 11:37  秋华  阅读(2853)  评论(0编辑  收藏  举报