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的理解又加深了一层呢。

最新文章

  1. 11.JAVA之GUI编程菜单
  2. JQuery_DOM 节点操作之复制、替换和 删除节点
  3. IIS7 WebAPI 404.0 Error
  4. C#生成随机验证码
  5. animate.css
  6. 绑定线程到特定CPU处理器
  7. 配置Windows Server 2008 允许多用户远程桌面连接
  8. IIC 概述之用IO模拟
  9. Android Handler Message总结一下
  10. linux进程通信之共享内存
  11. return 的使用
  12. java之装饰器模式
  13. 模板文件引入css样式文件
  14. HttpClient(一)HttpClient抓取网页基本信息
  15. hbase-bloom filter
  16. 【LeetCode每天一题】Combinations(组合)
  17. boost asio 学习(四)使用strand将任务排序
  18. 自动化部署shell
  19. POJ 2752 Seek the Name, Seek the Fame(next数组运用)
  20. ArrayList底层实现

热门文章

  1. @RequestMAPPPING映射请求占位符@PathVariable注解
  2. @uoj - 310@ 【UNR #2】黎明前的巧克力
  3. AlertController的使用
  4. Arduino+sim800C家居安防火灾报警 拨打电话 发送短信例程程序
  5. Ios App破解之路二 JJ斗地主
  6. 微信小程序-Page生命周期
  7. spring boot actuator扩展httptrace的记录
  8. Python干货整理之数据结构篇
  9. 平时Chrome中用的一些插件
  10. js语法基础入门(1)