power bi怎么计算度量值(PowerBI之DAX神功第2卷第12回)
power bi怎么计算度量值(PowerBI之DAX神功第2卷第12回)1.测试同期(去年):2020/1/1~2020/3/1表名:Sheet1如上表所示,最大日期是2021年3月1日本期(今年):2021/1/1~2021/3/1
《孙兴华讲PowerBI火力全开 可视化 DAX原理》全套视频
https://www.ixigua.com/6976409163886756383
《火力全开》笔记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'[日期]<=EDATE(MAX ('Sheet1'[日期]) -12 ) && 'Sheet1'[日期]>date(year(max('Sheet1'[日期]))-2 12 31)
很明显,这并不是我们想要的结果。
【新建列】列 = 'Sheet1'[日期]<date(year(max('Sheet1'[日期])) 1 1) && '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'[日期]))-1 1 1))
原理:SAMEPERIODLASTYEAR函数是返回日期列最大日期所在年,上一年的同期数据,但是在去年以前的数据都是完整的,而不是同期的。
这个时候,可以处理,我们再做月份的判断,让这张表的月份小于原表中日期列最大日期的月份,但是这相对就麻烦一些了。
现在我们使用Dateadd函数:
【新建表】表4 = FILTER(dateadd('Sheet1'[日期] -2 YEAR) '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系列函数名。