[已解决] 如何正确使用DAX中自定义变量函数VAR

  [复制链接]
查看99688 | 回复114 | 2020-9-25 03:28:03 | 显示全部楼层 |阅读模式
如图所示,对排名和金额的度量值分别使用自定义函数VAR,发现排名返回的值是错的,而金额返回的值是正确的。

两个DAX中的VAR完全一样,但结果却截然不同?

还请版主和各位大神指教。

谢谢。 10415101857331.png
10415101857333.zip (109.62 KB, 下载次数: 0)
回复

使用道具 举报

nasony | 2020-9-25 03:35:03 | 显示全部楼层
解释不清楚,但有个办法,因为sumx,rankx都是x类函数,他们的计算原则都是一样的,无非表现为不同的值显示方式,所以你将rankx都换成sumx,看看定义变量和不定义变量的区别,顺便把hasone去掉,就更明显了。这是我个人的理解
回复

使用道具 举报

深海 | 2020-9-25 03:42:03 | 显示全部楼层
前阵子我也正好在学习Variable的用法,在此与你分享:
Variable并不是全局的,它的上下文取决于定义的位置,一经计算后便不再改变。有一篇关于Variable的文章是这么写的:
In DAX, variables are calculated within the scope in which they are written, and then the result of them is stored and used in the rest of the expression.



当你把“排名_VAR”拉到透视表里后,在KA列,Rev的筛选上下文(有些书进一步将这种由行/列/切片器进行的筛选成为Query Context)为DimChannel="KA",那么Rev的值也就固定了;在RANKX里,虽然有ALLSELECTED(DimChannel[渠道])提供行上下文,但是Rev并不会受其影响了。

相对的,如果把Rev单独定义为度量值,然后在RANKX中引用,则能返回正确的结果:

Rev := SUM(RawData[销售额])
排名 M:= RANKX(ALLSELECTED(DimChannel[渠道]),[Rev])

PS: 从2楼上老师的回答中也得到了启发,可以使用SUMX来验证该度量值的实际取值。我手头的电脑里是EXCEL2010+PP add-in,打不开你的Data Model,就导入到POWER BI Desktop里,权当巩固复习了。

10415101857334.zip (38.1 KB, 下载次数: 0)
回复

使用道具 举报

wwolf | 2020-9-25 03:43:03 | 显示全部楼层
我又仔细再想了一下,就再多啰嗦一句,如果度量值定义为:

排名_Var2:=
RANKX(ALLSELECTED(DimChannel[渠道]),
  CALCULATE(
  VAR Rev=SUM(RawData[销售额])
  RETURN
  Rev)
)

定义在CALCULATE里的Rev就可以利用ALLSELECTED(DimChannel[渠道])的行上下文了。(存粹出于学习的目的用这种脱裤子放屁的写法)
回复

使用道具 举报

aleyou | 2020-9-25 03:51:04 | 显示全部楼层
透彻,一下说明白了,allselect对外部变量没有改变筛选,如果是度量,就可以改变
回复

使用道具 举报

华仑天弩974 | 2020-9-25 03:57:04 | 显示全部楼层
感谢以上两位高人的指点。

猜测自定义变量函数VAR,类似于Earlier函数,具有跳出当前上下文的属性。
回复

使用道具 举报

canape | 2020-9-25 03:58:04 | 显示全部楼层
我又仔细再想了一下,就再多啰嗦一句,如果度量值定义为:

排名_Var2:=


如图所示,用Calculate(),无法重新恢复上下文筛选,很是奇怪。 10415101857332.png
回复

使用道具 举报

skykeeper | 2021-5-18 16:15:27 来自手机 | 显示全部楼层
纯粹路过,没任何兴趣,仅仅是看在老用户份上回复一下
回复

使用道具 举报

深海 | 2021-5-31 21:27:05 来自手机 | 显示全部楼层
我也来顶一下..
回复

使用道具 举报

胡说八道 | 2021-6-14 19:25:47 | 显示全部楼层
支持,赞一个
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则