如何使用 DAX 函数计算上年值



工坊的小伙伴们,周五好啊!关于同期的计算是一个老生常谈的问题,今天我们来看一下计算上年值的几个DAX函数吧~


数据准备

我们虚拟从2018年1月至2019年4月的数据,如下:

file

构造日期表,可采用如下DAX语句构建:

Calendar =
ADDCOLUMNS (
    CALENDAR ( DATE ( 2017, 1, 1 ), DATE ( 2020, 12, 31 ) ),
    "年", YEAR ( [Date] ),
    "季度", "第"
        & ROUNDUP( MONTH ( [Date]) / 3, 0) & "季度",
    "月", MONTH ( [Date] ),
    "月份", MONTH ( [Date] )& "月",
    "年月", FORMAT ( [Date], "YYYY/MM" )
)

使用此表达式构造的日期表如下:

file

此表达式友友们可以研究下用到的几个函数,但无需深究,存起来到时直接使用即可。


DATEADD

将日期表与事实表建立关系,如下:

file

计算当前年的实际销售金额:

Sales =
SUM ( 'Fact'[订单金额] )
计算上年同期销售金额,我们可以写如下的度量值
Sales_同期 =
CALCULATE ( [Sales],DATEADD ( 'Calendar'[Date],-1, YEAR ))

在报表视图呈现结果如下,与2018年同期数据是吻合的:

file

而当表中字段为年时,得到的结果不是截至去年同期四月的销售额,而是去年全年的销售额:

file

同期显示的是全年的数据。


PREVIOUSYEAR

如果使用PREVIOUSYEAR来写上年值的话,那么度量值应该写成:

Sales_PY =
CALCULATE ( [Sales],PREVIOUSYEAR ( 'Calendar'[Date]) )

报表视图中呈现的结果如下:

file

无论表格中当前行是哪个月,Sales_PY均计算上年一整年的销售额。


SAMEPERIODLASTYEAR

如果使用SAMEPERIODLASTYEAR函数来写上年值的话,那么度量值应该写成:

Sales_SP =
CALCULATE ( [Sales],SAMEPERIODLASTYEAR ( 'Calendar'[Date]) )

报表视图中呈现的结果是:

file

当表格中放置的列是年时,结果与使用DATEADD计算结果是相同的。


PARALLELPERIOD

如果使用PARRELLPERIOD函数来写上年值的话,那么度量值应该写成:

Sales_PP =
CALCULATE ( [Sales],PARALLELPERIOD ( 'Calendar'[Date],-1, YEAR ))

根据验证,呈现结果与DATEADD函数计算结果相同:

file


总结

计算上年(同期)值,可使用如下几个函数:
DATEADD,PREVIOUSYEAR,SAMEPERIODLASTYEAR,PARRELLPERIOD。
以下几个表达式从今天的实验结果来看是等价的:

Sales_同期 =
CALCULATE ( [Sales],DATEADD ( 'Calendar'[Date],-1, YEAR ))
Sales_SP =
CALCULATE ( [Sales],SAMEPERIODLASTYEAR ( 'Calendar'[Date]) )
Sales_PP =
CALCULATE ( [Sales],PARALLELPERIOD ( 'Calendar'[Date],-1, YEAR ))

以下表达式总是返回上年一整年的销售额:

Sales_PY =
CALCULATE ( [Sales],PREVIOUSYEAR ( 'Calendar'[Date]) )

当选择的不是完整的月份而是一个日期段时,这些函数又会有怎么样的表现呢?敬请期待~

file


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


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


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

Power Pivot工坊