了解同比和环比
同比和环比是考察数据变化的两项常用的指标,它们都是基于时间周期的对比,得到的结果都是百分比,区别在于各自对标的周期(基期)不同。
何为同比
与历史同时期
的比较,例如将 2019 年 11 月的数据与 2018 年 11 月的数据相比,叫同比。同比一般情况下是今年与去年的比较。同比可以用来观察今年和去年相对发展水平的变化。
同比增长(下降)率=(本期数-去年同期数)/去年同期数×100%
何为环比
与上一个统计周期
的比较,例如将 2019 年 11 月的数据和 2019 年 10 月的数据相比,叫环比。环比使用的统计周期是连续的,一般情况下使用周、月或者自定义的一段日期。环比反应的是本期与上期相比的变化情况。
环比增长(下降)率=(本期数-上期数)/上期数×100%
同比和环比的区别
同比和环比都是反映变化速度的指标,由于两者采用的基期不同,因此指标的含义也不同。两者不能拿来直接比较,例如环比不能与同比比较,但是环比可以与环比比较。
同比和环比是两种不同的比较方式,同比针对同一时期进行对比,观察每一个时期是否有变化,而环比则是连续性的,可以反映出季节性的变化,同时进行调整。我们在制作报告的时候,尤其是经济报告,都会使用同比和环比的数据进行分析。
计算同比和环比
DAX 通过时间智能函数快速计算标准日期区间(比如年、季度、月、日)的同比和环比,我们将指标拆解开,会发现它们的本质都是对日期区间的计算,同比需要计算去年同期值,环比计算的是平移后的日期区间。
计算标准周期
从上一年(Previous Year 简称 PY)中获得数据对于比较今年和去年同期的趋势很有用,使用以下 DAX 表达式可以快速计算:
[PY Sales] := CALCULATE ( [Sales Amount], SAMEPERIODLASTYEAR ( 'Date'[Date] ) )
SAMEPERIODLASTYEAR 返回一年前的同一组日期。它是更通用的 DATEADD 函数的一个专用版本,DATEADD 可以定义需要移动的周期的数量和类型。支持的期间类型是年、季度、月和日。例如,你可以使用以下等价表达式定义相同的 PY Sales:
[PY Sales] := CALCULATE( [Sales Amount], DATEADD( 'Date'[Date], -1, YEAR ) )
以类似的方式,你可以计算前一个季度(PQ)、月份(PM)或日(PD)的值,如下面的示例所示:
[PQ Sales] := CALCULATE ( [Sales Amount], DATEADD ( 'Date'[Date], -1, QUARTER ) ) [PM Sales] := CALCULATE ( [Sales Amount], DATEADD ( 'Date'[Date], -1, MONTH ) ) [PD Sales] := CALCULATE ( [Sales Amount], DATEADD ( 'Date'[Date], -1, DAY ) )
始终计算完整周期
有时,你需要查看上一年度的总金额,并将其与年初至今的总金额进行比较。为此,你可以使用 PARALLELPERIOD,它与 DATEADD 类似,但会返回第三个参数中指定的完整周期,而不是 DATEADD 返回的部分周期。你可以定义这样一个 PY Sales,它计算的是上一年的销售总额:
[PY Total Sales] := CALCULATE ( [Sales Amount], PARALLELPERIOD ( 'Date'[Date], -1, YEAR ) )
在图 7-18 中,可以看到 PY Sales 和 PY Total Sales 的结果。报告的 PY Sales 列 2009 年各季度的结果显示了对应的 2008 年各季度的销售额数据。PY Total Sales 列每期计算了上一年的销售总额
PY Total Sales 可以用来计算当前年度至今与上年度总计的比率,它提供了一个简单的关键绩效指标(KPI)来检测当前年度 YTD 销售额是否达到上年度的总销售额。如图 7-18 所示,YTDOPYT Sales% 度量值使用以下公式计算了年初至今的销售额占前一年总销售额的比率:
[YTDOPYT Sales %] := DIVIDE ( [YTD Sales], [PY Total Sales] )
计算上一年的 YTD
你还可以将当前年度的 YTD 数据与前一年同期的 YTD 结果做对比,当需要计算前一年 YTD 时,可以混合使用目前学到的两种技术。这时你不能将 Date[Date]参数(它对应于当前筛选下文中活动的日期列表)直接传递给 SAMEPERIODLASTYEAR,而是需要使用 DATESYTD 函数对日期列表进行转换,先定义出当前年度下 YTD 使用的日期列表。但是,你也可以在不影响结果的情况下反转这些调用的顺序。以下两种关于 PY YTD Sales 的定义是等价的,即使第二种可能会稍微快一些(但几乎不可检测)。
[PY YTD Sales] := CALCULATE ( [Sales Amount], SAMEPERIODLASTYEAR ( DATESYTD ( 'Date'[Date] ) ) ) [PY YTD Sales] := CALCULATE ( [Sales Amount], DATESYTD ( SAMEPERIODLASTYEAR ( 'Date'[Date] ) ) )
你可以使用返回上一年日期列表的公式作为计算 YTD 度量值的筛选器参数,或者将返回 YTD 时间列表的公式作为计算去年同期度量值的筛选器参数,你可以使用这两种方式定义 PY YTD Sales,它们与之前的两个公式等价。
[PY YTD Sales] := CALCULATE ( [YTD Sales], SAMEPERIODLASTYEAR ( 'Date'[Date] ) ) [PY YTD Sales] := CALCULATE ( [PY Sales], DATESYTD ( 'Date'[Date] ) )
你可以在图 7-19 中看到 PY YTD Sales 的结果,YTD Sales 的值是前者平移一年的结果,在相同的报告中,你还可以看到在上一节末尾使用的 Fiscal YTD Sales 指标。请注意,财年 YTD 的计算在每年的第三季度重新开始
计算周期差值
当需要计算同比或环比的变化率时,我们要计算度量值的基期数据与当前结果的差异,你可以用绝对值或百分比来表示这种差异,上一节我们已经学习了如何通过 PY Sales 获得上一年度的值:
[PY Sales] := CALCULATE ( [Sales Amount], SAMEPERIODLASTYEAR ( 'Date'[Date] ) )
计算当前销售金额与去年同期的绝对差异(年同比,简写 YOY)可以使用简单的减法。你可以用下面的表达式来定义 YOY Sales 指标:
[YOY Sales] := [Sales Amount] - [PY Sales]
将年初至今的数据与上一年的相应结果进行比较也可以采用类似方法,即直接把两项指标,YTD Sales 和 PY YTD Sales 相减,你在上一节中已经知晓它们的公式写法,这里再重复一遍,作为提醒:
[YTD Sales] := TOTALYTD ( [Sales Amount], 'Date'[Date] ) [PY YTD Sales] := CALCULATE ([Sales Amount], DATESYTD ( SAMEPERIODLASTYEAR ( 'Date'[Date] ) ) ) [YOY YTD Sales] := [YTD Sales] - [PY YTD Sales]
多数情况下,在报告中展示年同比差异最好使用百分比形式,比如用 YOY Sales 除以 PY Sales。通过这种方式,差异使用上一期的值作为百分比的基准线(100%对应一年内翻倍)。在定义 YOY Sales% 的下列表达式中,如果上一年数据为空,DIVIDE 函数可以避免除数为零的错误出现:
[YOY Sales%] := DIVIDE ( [YOY Sales], [PY Sales] )
你可以创建一个类似的计算来显示 YTD 度量值的年同比差异,你可以用以下公式定义 YOY YTD Sales%
[YOY YTD Sales%] := DIVIDE ( [YOY YTD Sales], [PY YTD Sales] )
通过图 7-20 你可以在透视表中观察到这些度量值
老师,请问如果想要计算同一时间段的季度环比 应该怎么写公式?例如现在是Q1 3月22号,我们想要计算 从1月1号到3月20号的销量对于去年Q4从10月1号到12月22号的销量增长,应该如何计算?期待老师回复,非常感谢!
你在本节中看到的所有示例都可以在年、季度、月和日级别上运行,但不能在周级别上运行。时间智能函数不适用于周级别的计算,因为对周的定义多种多样。因此,你必须自己操作 DAX 表达式来处理基于周的计算。你可以在本章后面的文章中找到这种方法的更多细节和示例
————————–
更新了
老师,请问下怎么下载案例文件,我想看下适用于这个DAX函数的这个原始数据结构
老师, 想请教下为什么我同比使用sameperiodlastyear写好后, 时间切片器用清单形式选择日期可以正确显示, 但换成between的形式就抓不到数(显示为空白)了呢?
高老师,同比我会算了,但是经常要算同店同比应该怎么写公式呢?比如去年在北京有50家店,而今年有100家店,只选取两年都有的店铺作比较应该用什么方法比较好?
[YTD Sales] := TOTALYTD ( [Sales Amount], ‘Date'[Date] )
[PY YTD Sales] := CALCULATE ([Sales Amount],
DATESYTD ( SAMEPERIODLASTYEAR ( ‘Date'[Date] ) ) )
老师:公式里的第一参数:【sales amount】是不是应该是sum(【sales amount】)呢? totalytd和datesytd应该不具备对第一参数求和的功能吧?
刚才忘记登陆了,用游客身份问得问题。
高老师,我这几天反复试了SAMEPERIODLASTYEAR的功能,发现一个问题:
我理解SAMEPERIODLASTYEAR应该对应去年同样的时间段,比如今天是12月9日,度量值2019_Unit Volume_PES = CALCULATE(SUM(‘Rep4AEHPDList'[UnitCout]),SAMEPERIODLASTYEAR(DATESYTD(AECalender[Date],”6-30″)))那我得到的应该是去年7月1日到12月9日的数量,但我发现实际得到的是去年7月1日到12月31日的数据。
本来就应该这样?还是我的筛选条件有问题?
%
[YOY YTD Sales%] := DIVIDE ( [YOY YTD Sales], [PY YTD Sales] )
老师,文章这个公式是否少了 减1
老师,为什么下面PY 计算的同为1月的金额不一样呢?1个54,1个263,如图片。我这里的月份划分是按公司销售月走的,不是普通的自然月。
我验证了下数据,2019年1月的54,和263的区别:54采用的就是实际2019年1月的销售月计算的,而263竟然采用年份为2019年里的数据,但是1月的周期却等同为2020年1月的日期段。如何让其调整为2019年的1月周期呢,且显示数据为54?
谢谢老师。
案例文件放错了