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

数据可视化之DAX篇(九) 关于DAX中的VAR,你应该避免的一个常见错误的更多相关文章

  1. 数据可视化之PowerQuery篇(四)二维表转一维表,看这篇文章就够了

    https://zhuanlan.zhihu.com/p/69187094 数据分析的源数据应该是规范的,而规范的其中一个标准就是数据源应该是一维表,它会让之后的数据分析工作变得简单高效. 在之前的文 ...

  2. 数据可视化之 图表篇(二)如何用Power BI制作疫情地图?

    丁香园制作的这个地图可视化,相信大家每天都会看好几遍,这里不讨论具体数据,仅来探讨一下PowerBI地图技术. 这个地图很简洁,主要有三个特征: 1,使用着色地图,根据数据自动配色 2,只显示中国地图 ...

  3. 【WaaCaa】一款开源科学作图/数据可视化工具 —— 诞生篇

    作为一个理工男.用过了形形色色能够用于科学作图/数据可视化软件:从大学时做实验课推荐用于分析简单採集数据的 Origin; 毕业论文时用来呈现实验时序信号和离线分析脑电信号的 MATLAB.后面还发现 ...

  4. 数据可视化之 图表篇(四) 那些精美的Power BI可视化图表

    之前使用自定义图表,每次新打开一个新文件时,都需要重新添加,无法保存,在PowerBI 6月更新中,这个功能得到了很大改善,可以将自定义的图表固定在内置图表面板上了. 添加自定义图表后,右键>固 ...

  5. 数据可视化之PowerQuery篇(七)Power Query应用技巧:批量更改列名

    https://zhuanlan.zhihu.com/p/130460772 ​今天分享一个PowerQuery的小技巧,导入到PowerBI中的数据,如果想要更改数据的列名,可以在PQ编辑器中直接双 ...

  6. 数据可视化之PowerQuery篇(十九)PowerBI数据分析实践第三弹 | 趋势分析法

    https://zhuanlan.zhihu.com/p/133484654 ​本文为星球嘉宾"海艳"的PowerBI数据分析工作实践系列分享之三,她深入浅出的介绍了PowerBI ...

  7. 数据可视化之分析篇(九)PowerBI数据分析实践第三弹 | 趋势分析法

    https://zhuanlan.zhihu.com/p/133484654 以财务报表分析为例,介绍通用的分析方法论,整体架构如下图所示: (点击查看大图) 我会围绕这五种不同的方法论,逐步阐述他们 ...

  8. 数据可视化之PowerQuery篇(九)巧用Power Query,Excel也可以轻松管理文档

    https://zhuanlan.zhihu.com/p/111674088 ​来自知乎一个朋友的问题,如何在Excel中批量插入文件的超链接,以便在Excel中对文档进行有序的目录管理? 这个问题的 ...

  9. 数据可视化之分析篇(八)Power BI数据分析应用:结构百分比分析法

    https://zhuanlan.zhihu.com/p/113113765 PowerBI数据分析02:结构百分比分析法 作者:海艳 结构百分比分析法,又称纵向分析,是指同一期间财务报表中不同项目间 ...

随机推荐

  1. OpenSSL & 加密解密

    OpenSSL&加密解密(思维导图) 1. 网络通信概述 传输层协议 进程间通信 监听端口 SSL 裸套接字 2. 加密和解密 2.1 加密的方式 对称加密 公钥加密 单向加密 认证加密 2. ...

  2. Idea 添加注释:类注释、方法注释(可获取参数)

    原文链接:https://blog.csdn.net/liqing0013/article/details/84104419 Idea 添加注释:类注释.方法注释 类注释 File–Setting–E ...

  3. 【Spring】Bean的LifeCycle(生命周期)

    菜瓜:水稻,上次说Bean的LifeCycle,还没讲完 水稻:啥?说人话? 菜瓜:spring,bean,生命周期 水稻:哦哦,下次直接说人话.说正事,先从BeanFactory.Applicati ...

  4. c++_primer_第4版目录

    https://vdisk.weibo.com/s/BN_NALmbbBH01 第1章 快速入门1.1 编写简单的C++程序1.2 初窥输入/输出1.2.1 标准输入与输出对象1.2.2 一个使用IO ...

  5. zip矩阵转至

    list01=[1,2,3,4] list02=["a","b","c","d"] for itme in zip(li ...

  6. Java Jar 包加密 -- XJar

    Java Jar 包加密 一.缘由 Java的 Jar包中的.class文件可以通过反汇编得到源码.这样一款应用的安全性就很难得到保证,别人只要得到你的应用,不需花费什么力气,就可以得到源码. 这时候 ...

  7. JavaWeb网上图书商城完整项目--day02-11.激活功能流程分析

    1.当用户注册成功之后,会给用户发送邮件,当用户点击邮件的激活按钮的时候,会调用UserServlet中的activation的方法,并且会把激活码传递到后台,后台业务层对业务进行操作

  8. 01.scrapy入门

    Scrapy快速入门 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,它使用Twisted这个异步网络库来处理网络通讯,架构清晰,并且包含了各种中间件接口,可以灵活的完成各种需求. ...

  9. Day10-微信小程序实战-交友小程序-实现删除好友信息与子父组件间通信

    回顾:上一次已经把消息的布局以及样式做好了 效果图: 在removeList.js文件中,messageId就是发起这个消息的用户了 先查看一下自定义组件的生命周期 https://developer ...

  10. windows操作系统查看端口,关闭端口进程

    根据端口号查找进程 netstat -ano | findstr "端口号" 杀死进程 taskkill /pid "pid(最后一个数值)" /f