DAX | 理解 AVERAGEX 函数的参数构成与计算逻辑

本期重点:
理解AVERAGEX的参数构成
理解AVERAGEX函数的计算逻辑

小伙伴们好啊。
今天为大家介绍的函数是AVERAGEX
该函数的参数如下:

AVERAGEX(<table>,<expression>)

简单描述一下:一参提供一张表(表表达式),二参提供一个表达式,该表达式将对一参中的表每一行进行迭代计算结果,最后计算平均值

相信很多小伙伴都有接触过移动平均的概念(对移动平均还不熟悉的小伙伴可以参考工坊的这篇文章:移动平均与预测),对这个函数的用法已经大致了解。接下来我们通过一个简化的数据模型,计算过去两天(含当日)的平均销售额,加深大家对AVERAGEX函数的理解。

1数据准备

file

源数据中有两列数据,日期和销售额。另有一张日期表和源数据建立一对多关系。

2度量值编写

过去两天平均销售额V1 =
VAR CurrentDate =
    MAX ( '日期表'[Date] )
VAR Period =
    FILTER (
        ALL( '日期表'[Date] ),
        '日期表'[Date] >= CurrentDate - 1
            && '日期表'[Date] <= CurrentDate
    )
VAR Result =
    AVERAGEX ( Period, [销售额] )
RETURN
    Result

通过CurrentDate返回当前上下文的日期,然后用该日期通过FILTER函数返回对日期表的筛选,该日期表包含当前上下文的日期和前一天的日期。最后计算两天的平均销售额。
一起来看结果,截图如下:

file

结果可能出乎一些小伙伴的意料,10月2号的结果不是1号和2号的平均销售额而是1号的销售额,但4号却计算出了正确的销售额(3号和4号的平均销售额)。
对于这个问题的解释是:AVERAGEX函数忽略一参中计算结果为0的行。对于10月2号当前行来说,虽然有1号和2号两个日期,但2号的销售额为0。所以AVERAGEX将忽略2号,从而计算的结果将是1号的平均销售额。
那如果一定要计算前后两天的平均销售额要怎么办呢。由于AVERAGEX函数的内部计算逻辑限定,这个时候就不能借助AVERAGEX函数来实现了。给出以下度量值供参考:

过去两天平均销售额 V2 = 
VAR CurrentDate =
    MAX ( '日期表'[Date] )
VAR Period =
    FILTER (
        ALL( '日期表'[Date] ),
        '日期表'[Date] >= CurrentDate - 1
            && '日期表'[Date] <= CurrentDate
    )
VAR Result =
    DIVIDE ( CALCULATE ( [销售额], Period ), COUNTROWS ( Period ) )
RETURN
    Result

DIVIDE函数的分子为当前上下文的前后两天的销售额,分母用COUNTROWS计算筛选的表(Period)的行数(天数)。这样我们用自定义的方式限定了DIVIDE函数的分母,最终结果截图如下:

file

V1和V2没有对错之分,要如何计算取决于具体的业务逻辑。小伙伴们在使用这个函数的时候,要多多留心哦。
最后留一道思考题:总计行的结果返回空。聪明的小伙伴们能想到为什么吗,欢迎踊跃留言吧。祝大家学习愉快,下次见。

  • PowerPivot工坊原创文章,转载请注明出处!

    如果您想深入学习微软Power BI,欢迎登录网易云课堂试听学习我们的“从Excel到Power BI数据分析可视化”系列课程。或者关注我们的公众号(PowerPivot工坊)后猛戳”在线学习”。


长按下方二维码关注“Power Pivot工坊”获取更多微软Power BI、PowerPivot相关文章、资讯,欢迎小伙伴儿们转发分享~

Power Pivot工坊