快捷搜索:  汽车  科技

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(日期列) //返回一年以前的同一组日期

power bi怎么计算度量值(PowerBI之DAX神功第2卷第12回)(1)

表名:Sheet1

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

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

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

1.测试

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

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

power bi怎么计算度量值(PowerBI之DAX神功第2卷第12回)(2)

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

power bi怎么计算度量值(PowerBI之DAX神功第2卷第12回)(3)

2.回答网友的问题

power bi怎么计算度量值(PowerBI之DAX神功第2卷第12回)(4)

现在我来回答你的问题:

power bi怎么计算度量值(PowerBI之DAX神功第2卷第12回)(5)

表名:Sheet1

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

power bi怎么计算度量值(PowerBI之DAX神功第2卷第12回)(6)

问题就出现在这里,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

power bi怎么计算度量值(PowerBI之DAX神功第2卷第12回)(7)

power bi怎么计算度量值(PowerBI之DAX神功第2卷第12回)(8)

3.日期有重复怎么办?

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

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

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

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

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

power bi怎么计算度量值(PowerBI之DAX神功第2卷第12回)(9)

表名: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)

power bi怎么计算度量值(PowerBI之DAX神功第2卷第12回)(10)

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

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

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

power bi怎么计算度量值(PowerBI之DAX神功第2卷第12回)(11)

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

power bi怎么计算度量值(PowerBI之DAX神功第2卷第12回)(12)

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

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

power bi怎么计算度量值(PowerBI之DAX神功第2卷第12回)(13)

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

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

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

语法:DATEADD ( <日期列> <偏移量> <偏移单位> )

power bi怎么计算度量值(PowerBI之DAX神功第2卷第12回)(14)

以下表为例:

power bi怎么计算度量值(PowerBI之DAX神功第2卷第12回)(15)

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

power bi怎么计算度量值(PowerBI之DAX神功第2卷第12回)(16)

power bi怎么计算度量值(PowerBI之DAX神功第2卷第12回)(17)

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

power bi怎么计算度量值(PowerBI之DAX神功第2卷第12回)(18)

更灵活的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))

power bi怎么计算度量值(PowerBI之DAX神功第2卷第12回)(19)

原理:SAMEPERIODLASTYEAR函数是返回日期列最大日期所在年,上一年的同期数据,但是在去年以前的数据都是完整的,而不是同期的。

这个时候,可以处理,我们再做月份的判断,让这张表的月份小于原表中日期列最大日期的月份,但是这相对就麻烦一些了。

现在我们使用Dateadd函数:

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

power bi怎么计算度量值(PowerBI之DAX神功第2卷第12回)(20)

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()

power bi怎么计算度量值(PowerBI之DAX神功第2卷第12回)(21)

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

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

power bi怎么计算度量值(PowerBI之DAX神功第2卷第12回)(22)

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系列函数名。

猜您喜欢: