数据可视化之DAX篇(九) 关于DAX中的VAR,你应该避免的一个常见错误
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的理解又加深了一层呢。
最新文章
- 11.JAVA之GUI编程菜单
- JQuery_DOM 节点操作之复制、替换和 删除节点
- IIS7 WebAPI 404.0 Error
- C#生成随机验证码
- animate.css
- 绑定线程到特定CPU处理器
- 配置Windows Server 2008 允许多用户远程桌面连接
- IIC 概述之用IO模拟
- Android Handler Message总结一下
- linux进程通信之共享内存
- return 的使用
- java之装饰器模式
- 模板文件引入css样式文件
- HttpClient(一)HttpClient抓取网页基本信息
- hbase-bloom filter
- 【LeetCode每天一题】Combinations(组合)
- boost asio 学习(四)使用strand将任务排序
- 自动化部署shell
- POJ 2752 Seek the Name, Seek the Fame(next数组运用)
- ArrayList底层实现