Power BI之DAX神功:第2卷第12回 计算同比与环比

您所在的位置:网站首页 上个月为零怎么算环比 Power BI之DAX神功:第2卷第12回 计算同比与环比

Power BI之DAX神功:第2卷第12回 计算同比与环比

2024-07-11 14:36| 来源: 网络整理| 查看: 265

《火力全开》笔记27.时间智能日期函数中已经对SAMEPERIODLASTYEAR函数与DATEADD函数已经做过详细解释,今天我们主要来处理一下,网友在实际中遇到的问题。

一、SAMEPERIODLASTYEAR函数【同比】

语法:SAMEPERIODLASTYEAR(日期列)   //返回一年以前的同一组日期

表名:Sheet1

如上表所示,最大日期是2021年3月1日

本期(今年):2021/1/1~2021/3/1

同期(去年):2020/1/1~2020/3/1

1.测试

【新建表】表1 = SAMEPERIODLASTYEAR('Sheet1'[日期])

// 这样就可以得到同比的日期

【度量值】同期 = CALCULATE(SUM(Sheet1[销售]),SAMEPERIODLASTYEAR('Sheet1'[日期]))

2.回答网友问题

现在我来回答你的问题:

表名:Sheet1

【新建表】表2 = SAMEPERIODLASTYEAR('Sheet1'[日期])

问题就出现在这里,SAMEPERIODLASTYEAR产生的表并不是2020/1/1~2020/3/1的

处理方法如下:

【新建表】表2 = FILTER(SAMEPERIODLASTYEAR('Sheet1'[日期]),'Sheet1'[日期]>date(year(max('Sheet1'[日期]))-2,12,31))

//筛选SAMEPERIODLASTYEAR生成的表中日期大于最大年减2那一年12月31日以后的数据,最大日期是2021/3/1,这一年是2021年,2021-2=2019年,2019年12月31日以后的数据就是2020/1/1~2020/3/1

3.日期有重复怎么办?

不受影响!《火力全开》中我们已经鉴定过了。只有早期版本受限,需要使用VALUES或DISTINCT函数对多端表日期列去重,目前的PowerBI版本是无需这个步骤的。

据了解:从PowerBI于2020.4月版本取消了这个限制

问:是不是我就不需要新建日期表了?

答:依据个人需求而定!假设你想在矩阵行标题上写星期,日期表还是更方便一些。

4.特殊需求:今年截止目前的数据对比去年全部数据

表名:Sheet1

如上图所示,本期是2021/1/1~2021/3/1,同期应该是2020/1/1~2020/3/1

但是,特殊需求,我要使用本期数据与同期全年数据进行对比

关于网上流传的利用EDATE函数和辅助列方式,并不万能,他的案例可以,换个案例就失效了:

Ps: EDATE函数在《火力全开》笔记19.3讲过

【新建列】列 = 'Sheet1'[日期]date(year(max('Sheet1'[日期]))-2,12,31)

很明显,这并不是我们要的结果。

【新建列】列 = 'Sheet1'[日期]date(year(max('Sheet1'[日期]))-2,12,31)

// 我的方法看似爆弱,但是安全且万能!新建列是行上下文,逐行扫描,小于最大日期所在年的1月1日,且,大于最大日期所在年减掉2年的12月31日的数据。是不是最简单的数学知识!

【度量值】 同期 = CALCULATE(SUM(Sheet1[销售]),FILTER('Sheet1','Sheet1'[列]=True))

5.同期会算了,本期怎么算?

上节课讲的年初至今TOTALYTD和DATESYTD这么快就忘记了?

以上处理问题的方法同样适用于下面这个函数:

二、更灵活的DATEADD函数(既可以环比,又可以同比)

DATEADD函数灵活在哪里?同比和环比皆可计算!

语法:DATEADD ( , , )

以下表为例:

【新建表】表3 = dateadd('Sheet1'[日期],-1,YEAR)

// 存在同样的问题,我们使用同样的方法优化

【新建表】表4=FILTER(dateadd('Sheet1'[日期],-1,YEAR),'Sheet1'[日期]>date(year(max('Sheet1'[日期]))-2,12,31))

更灵活的DATEADD体现在两个方面:

1.特殊情况下的案例

假设:2020年因特殊原因,有好几个月处于三天打鱼两天晒网的状态,销售惨淡,不便做为同比数据,那就与2019年同期做对比。这就是特殊情况!

本期:2021/1/1~2021/3/1

同期:2019/1/1~2019/3/1

如果我们使用SAMEPERIODLASTYEAR函数:显然得到的日期是错误的!

【新建表】表3 = FILTER(SAMEPERIODLASTYEAR('Sheet1'[日期]),'Sheet1'[日期]>date(year(max('Sheet1'[日期]))-3,12,31) && 'Sheet1'[日期]date(year(max('Sheet1'[日期]))-3,12,31))

Ps: 我已经提前告诉大家了,这是在特殊情况下的案例,不是每一年都像2020年那样不平凡。

2.除了年,我们还可以看到季度、月份和天

总销售=sum(Sheet1[销售])

上年 = CALCULATE([总销售],DATEADD('Sheet1'[日期], -1, YEAR ))

上月 = CALCULATE([总销售],DATEADD('Sheet1'[日期], -1, MONTH )))

上季 = CALCULATE([总销售],DATEADD('Sheet1'[日期], -1, Quarter))

上一天 = CALCULATE([总销售],DATEADD('Sheet1'[日期], -1, Day))

现在,我们以“上月”为例:

【度量值】上月 = CALCULATE([总销售],DATEADD('Sheet1'[日期], -1, MONTH )))

// 没有上个月的数据肯定是Blank()

很多人做到这一步,不知道怎么算环比,详见《DAX神功》第1卷第4回

【度量值】环比 = if([上月]=BLANK(),BLANK(),DIVIDE([总销售],[上月])-1)

Ps:关于总计显示为空的问题已经老生常谈了,不再赘述。

3.回答网友问题,我只想显示2021年的环比

我们以前学过那么多知识,你随便拿出一样来就能解决

【度量值】上月 = CALCULATE(CALCULATE([总销售],DATEADD('Sheet1'[日期], -1, MONTH )),KEEPFILTERS('Sheet1'[日期]>date(2020,12,31)))

为什么2018/1/1~2020/4/1还显示在矩阵中?

你将矩阵列标题中的【销售】去掉就OK了

三、除了Calculate之外,TOTAL系列也可以实现同比和环比计算

上节课告诉大家,我更习惯用后者

【度量值】今年 = TOTALYTD(sum('Sheet1'[销售]),'Sheet1'[日期]) 

【度量值】去年 = TOTALYTD(SUM(Sheet1[销售]),FILTER(dateadd('Sheet1'[日期],-1,YEAR),'Sheet1'[日期]>date(year(max('Sheet1'[日期]))-2,12,31)))

上述方法,我们计算的是同比,如果是环比呢?修改Dateadd的第3参数,修改Total系列函数名。

特别提示:

关于SAMEPERIODLASTYEAR和DATEADD函数你还有什么问题,发稿后3天之内私信我。

我方便出答网友问的文章,时间久了,您的问题与《DAX神功》不具有连续性时

您的问题就会等到下次讲PowerBI时再回答了。。。也许就是2022年了。。。

抓紧时间哦!

《孙兴华讲PowerBI火力全开》PowerBI必学课程

https://www.bilibili.com/video/BV1qa4y1H7wp

《DAX神功》文字版合集:

https://www.bilibili.com/read/readlist/rl442274

《DAX神功》视频版合集:

https://www.bilibili.com/video/BV1YE411E7p3

PowerBI(DAX函数)、PowerQuery(M函数)、Python办公自动化、Python爬虫、Python数据分析、ExcelVBA、WordVBA、AccessVBA、MySQL等等

https://www.bilibili.com/read/cv10222110



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3