https://zhuanlan.zhihu.com/p/67803111
本文源于微博上一位朋友的问题,在计算同比增长率时,以下两种DAX代码有什么不同?
--------------------
YOY% 1 =
VAR sales=SUM('订单'[销售额])
VAR lysales=
CALCULATE(
SUM('订单'[销售额]),
SAMEPERIODLASTYEAR('日期表'[日期]))
RETURN DIVIDE(sales-lysales,lysales)
--------------------
--------------------
YOY% 2 =
VAR sales=SUM('订单'[销售额])
VAR lysales=
CALCULATE(
sales,
SAMEPERIODLASTYEAR('日期表'[日期]))
RETURN DIVIDE(sales-lysales,lysales)
--------------------
这两种方式,只是在计算上年销售额lysales时,CALCULATE的第一个参数有区别,第一种方式是使用SUM('订单'[销售额]),而第二种方式是利用了上一步VAR定义好的sales来进行运算。
你可以先思考一下,上述两种方式哪一种可以返回期望的结果呢?
将这两个度量值放进矩阵中看看结果,
因为2016年没有上年数据,所以YOY%1 2016年的结果为空,也属正常,2017年正常计算出结果。
但是YOY%2 的每个值都是零,为什么是这个结果呢?
并且这种写法还是参考了微软官方文档中VAR的使用示例:
https://docs.microsoft.com/zh-cn/dax/var-dax
所以官方的资料中也会有失误的情况,而我之前的文章中(学会VAR,你就离掌握DAX更近了一步)也介绍了这个写法,当时没有细想,也没有实际验证,现在看来,也是很有问题的,这里给大家道个歉。
第二种写法到底有什么问题呢?
还是要回到VAR的特征,它定义的是一个变量,但是它一旦定义完成,在当前的计算中就变成了一个固定值,不会再发生变化,所以在计算lysales时,无论是否有 SAMEPERIODLASTYEAR的条件,它都会等于sales,因此导致结果都等于0。
如果还不明白,我们可以再分别验证一下sales和lysales的结果,
再建两个度量值:
--------------------
sales =
VAR sales=SUM('订单'[销售额])
RETURN sales
--------------------
--------------------
lysales =
VAR sales=SUM('订单'[销售额])
VAR lysales=
CALCULATE(
sales,
SAMEPERIODLASTYEAR('日期表'[日期]))
RETURN lysales
--------------------
结果如下,
lysales的计算结果和sales完全一样!
以2017年为例,VAR定义的变量sales的结果是1666736,在计算lysales时,就变成了:
CALCULATE(
1666736,
SAMEPERIODLASTYEAR('日期表'[日期]))
结果当然还是1666736.
如何解决这个问题呢,就是使用本文开头的第一种写法,定义的sales和lysales都要独立根据上下文运算,分别得出正确的结果以后,再进行增长率运算。
通过这个例子,是不是对VAR的理解又加深了一层呢。