美文网首页数据分析PowerBI专栏工具癖
使用VAR,你也应避免这个错误

使用VAR,你也应避免这个错误

作者: PowerBI星球 | 来源:发表于2019-03-26 20:23 被阅读41次

本文源于微博上一位朋友的问题,在计算同比增长率时,以下两种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的理解又加深了一层呢。

关于PowerBI的学习,平时一定要多思考,多动手;看各种学习资料时不盲从,保持好奇心,会提升的更快。

我会尽量避免再出现这种错误的哦,感谢大家的支持和包容。


PowerBI星球

相关文章

  • 使用VAR,你也应避免这个错误

    本文源于微博上一位朋友的问题,在计算同比增长率时,以下两种DAX代码有什么不同? ----------------...

  • js语法

    注释尽量避免使用块级注释,可以避免下面错误: var rm_a = /a*/.match(a); 标识符字母开头,...

  • 2018-12-28

    Optimal error rate:最优错误率,无法避免错误率 Avoidable bias:可优化误差 Var...

  • xunsearch 安装

    记录xunsearch 安装 使用 这个错误需要定位到安装目录,这里是/var/webwww/xunsearchc...

  • var let 和 const详解

    推荐使用 let 来定义变量,而逐渐放弃使用 var ,这样会使你的代码更加规范,避免出现那些你很难预料的bugc...

  • PostgreSQL数据迁移

    使用navicat 勾选序列,避免错误:

  • 常见的OKR错误应避免

    目标和关键结果是一种可靠的方法。它可以使您的团队围绕共同的目标进行调整,并激发他们超越团队的极限。但是,有些公司以...

  • EJF Spool / Printing: Could not

    在/var/log/messages里面看到这个错误,这个错误可能有两种情况造成。 printing:could ...

  • 闭包与自执行函数

    函数调用 函数声明与调用我们可以通过如下定义函数,使用fun()来调用 也可以用var来定义,此时应先声明后使用 ...

  • sudo: /var/db/sudo/ts is owned b

    不确定是不是在操作时修改了权限,只要使用到sudo 就会报这个错误sudo: /var/db/sudo/ts is...

网友评论

    本文标题:使用VAR,你也应避免这个错误

    本文链接:https://www.haomeiwen.com/subject/ypanvqtx.html