加入 PowerBI自己学 知识星球:下载源文件,边学边练;遇到问题,提问交流,有问必答。
微软官方中文定义,硬生生的直译带来了语义上的误解。中文定义翻译校正:将表达式的结果存储给一个变量,可以将其作为参数传递给计算过程的其他表达式去使用。 变量被赋值以后,它的值不会改变。即使在其他修改了上下文的表达式中引用它,它的值也不会改变。
VAR的英文全拼是Variable,翻译过来是变量。用初中代数比较好理解,VAR 定义一个变量a,a可能等于1,也可能等于2,每一次生成过程中它随上下文变化返回不同的结果,所以我们把它叫做变量。
有人会说,写个度量值a,不也是和变量有同样的效果吗?广义上讲,度量值也算是一个变量。但VAR和度量值不尽相同,有它自己的特点和用武之地。
VAR特点
1 VAR可以是值,也可以是表。
2 VAR只用在计算过程中,用一次扔一次,减少冗余的度量值或计算表,简化模型。
3 使用VAR可以实现分步骤计算,公式的可读性更强, 计算性能更高。
举例:不写前一天销量的度量值,用VAR直接写日环比增长的度量值。
日环比增长 =
VAR _vm_lastday = CALCULATE([销量], DATEADD(Dim_Date[Date],-1,DAY))
RETURN DIVIDE([销量]-_vm_lastday,_vm_lastday)
4 使用VAR可以生成过程表,辅助计算。此过程表随画布的上下文变化,不像计算表不随画布的上下文变化。
举例:先按照上下文生成一个客户和客户最大销量的表,然后求最大销量这一列的和。
每客户最大销量之和 =
VAR _vt_max = SUMMARIZE('销量表',[客户],"最大值",MAX('销量表'[数量]))
RETURN SUMX(_vt_max, [最大值])
筛选日期后,每客户的最大销量之和也会随之变化。
5 VAR和RETURN是CP,通过RETURN返回步骤中的VAR变量,可以验证过程数据的正确性。
举例:在RETURN后面的表达式前加“--”,将其变为注释,填上_vm_lastday,在画布中查看_vm_lastday的结果。
日环比增长2 =
VAR _vm_lastday = CALCULATE([销量], DATEADD(Dim_Date[Date],-1,DAY))
RETURN _vm_lastday --DIVIDE([销量]-_vm_lastday,_vm_lastday)
6 VAR可用于行上下文中条件判断的参数,度量值则因为自带筛选上下文不能这样用。
举例:去掉单笔最大销量,求其它销量的和。
销量 = SUM('销量表'[数量])
单笔最大销量 = MAX('销量表'[数量])
不含单笔最大销量的销量_用度量值 =
CALCULATE([销量], FILTER('销量表', [数量]<[单笔最大销量]))
使用度量值,行上下文转为筛选上下文,度量值取的最大值都是这一行的数量,与这一行的数量相等,因此求和返回空值。
不含单笔最大销量的销量_用VAR =
VAR _vm_max=[单笔最大销量]
RETURN CALCULATE([销量], FILTER('销量表', [数量]<_vm_max))
使用VAR,单笔最大销量6存储在了_vm_max中,经过筛选去掉了数量是6的这一行,求和为剩余行的数量之和。
7 VAR在计算列中可替代EARLIER。
举例:在数据表中新建计算列,计算每个客户的销量之和。
每客户销量之和 =
VAR _vm_CurrentCustomer = [客户]
RETURN
CALCULATE(
SUM('销量表'[数量]),
FILTER('销量表', [客户]=_vm_CurrentCustomer)
)
注意事项
1 跨表达式里面的VAR可以重名,但是不能和表、字段、度量值重名,不支持中文。给名称加一个前缀“_vm_”(针对值)或“_vt_”(针对表),可以有效避免重名,并能通过输入前缀字符实现快速调用VAR。
2 调用VAR表的时候,不支持_vt_Table[列名],比如SUM(_vt_Table [列名])就不行,所以SUM这种封装函数用不了,要使用迭代函数的原始形式,像这样,SUMX(_vt_Table, [列名])等。
3 VAR不能用作CALCULATE的第一参数(包括需要随行上下文筛选的参数,比如SUMX的第二参数),虽然它等于一个度量值,从文字上看起来也一样,但是它的值生成后,就不变了。
举例:将_vm_sales用于CALCULATE的第一参数,前一天销量跟当天销量相等,不能达到目的。
前一天销量_错误 =
VAR _vm_sales=SUM('销量表'[数量])
RETURN CALCULATE(_vm_sales, DATEADD(Dim_Date[Date],-1,DAY))