Power BI之DAX神功:第2卷第12回 计算同比与环比 |
您所在的位置:网站首页 › 上个月为零怎么算环比 › Power BI之DAX神功:第2卷第12回 计算同比与环比 |
《火力全开》笔记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 |