2.15 PowerBI数据建模-理解VAR

加入 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))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值