无日期上下文的本月至今的同比环比 | PowerBI星球

前面的文章曾介绍了无日期上下文的同比环比,不过数据是整月的累计,如果想计算本月至今的数据,以及相对应的上月、去年同期对比,应该怎么做呢?

其逻辑依然是不利用外部上下文,仅利用今天的日期TODAY,构造一个从本月1号到今天的日期列表,然后再执行汇总计算,度量值可以这样写:

收入 MTD =
CALCULATE(
[收入],
FILTER(
ALL('日期表'),
'日期表'[日期]>=EOMONTH(TODAY(),-1)+1
&&'日期表'[日期]<=TODAY()
)
)

这里用到了EOMONTH函数,它的用法如下:

EOMONTH是一个日期函数,返回移动指定月份后的当月的最后一天日期,比如EOMONTH("2021-3-15",-1)将返回2021年2月的最后一天日期:2021-2-28。

EOMONTH可以返回移动后的月份的最后一天的日期,所以通过这个函数构造出EOMONTH(TODAY(),-1)+1,将返回本月第一天的日期,利用这个逻辑,顺利计算出本月至今的数据。

同样的方式,计算上个月的本月至今,可以这样写:

收入 MTD PM =

CALCULATE(

[收入],

FILTER(

ALL('日期表'),

'日期表'[日期]>=EOMONTH(TODAY(),-2)+1

&&'日期表'[日期]<=EDATE(TODAY(),-1)

)

)

EOMONTH(TODAY(),-2)+1返回上个月的第一天,然后上个月的今日,利用了另外一个日期函数EDATE,EDATE(TODAY(),-1)返回上月的今日。

EDATE的用法如下:

EDATE也是一个日期函数,返回移动指定月份后的对应日期,比如EDATE("2021-3-15",1)将返回"2021-4-15",如果移动后的日期在对应的月份中不存在,晚于当月最后一天,则自动返回该月的最后一天,比如EDATE("2021-3-30",-1),2月是没有30号的,则自动返回为最后一天2021-2-28。

这里用到了两个常用的日期函数,它们功能非常容易理解,只和提供的参数有关,和其他上下文没有关系,也不需要日期表,比时间智能函数的逻辑简单多了,在某些场景下很好用。

当然TODAY本身也是个日期函数。

同理,可以很容易的计算出本月至今的上年同期数据:

收入 MTD PY =

CALCULATE(

[收入],

FILTER(

ALL('日期表'),

'日期表'[日期]>=EOMONTH(TODAY(),-13)+1

&&'日期表'[日期]<=EDATE(TODAY(),-12)

)

)

用矩阵显示如下:
计算上月同期数据时候,还有个小问题是,如果本月的天数比上个月少,比如2021年2月份,2月28号是最后一天,本月至今就是2月整月累计的数据,但上期是1月1号到28号的数据,如果想让1月也显示出整月的累计数,可以加个判断逻辑,这样来写本月至今的上月的度量值:
上面利用了日期函数,很方便了计算出了本月至今和环比、同比的数据,那么能不能利用时间智能函数来完成这些运算呢,也是可以的。

下面看看利用时间智能函数的写法:

收入 MTD1 =

CALCULATE(

[收入],

DATESMTD(

TREATAS({TODAY()},'日期表'[日期]))

)

因为没有外部日期上下文,这里利用了TREATAS将TODAY视同为日期表里的日期,作为DATESMTD的上下文,这样就会返回从月初至今的日期列表,然后执行汇总计算。

TREATAS的第一个参数必须是个表,而日期函数返回一个值,所以在外面套个大括号{ },就可以将值变成表。

同理本月至今的上月以及上年同期,时间智能函数的写法是这样的:

收入 MTD PM1 =

CALCULATE(

[收入],

DATESMTD(

TREATAS({EDATE(TODAY(),-1)},'日期表'[日期]))

)

收入 MTD PY1 =

CALCULATE(

[收入],

DATESMTD(

TREATAS({EDATE(TODAY(),-12)},'日期表'[日期]))

)

其结果和前面的写法完全一样:

这里就灵活运用了日期函数和时间智能函数,实现了无外部上下文的各种计算。

本文用到的这几个度量值,值得你去细细理解了其中的逻辑,将加深你对日期函数和时间智能函数的理解,掌握这个思路以后,以后碰到类似的分析时都可以利用这类函数轻松计算。


我的新书已上市,帮你从0到1,轻松上手PowerBI
感兴趣的同学可以扫描下方二维码在京东购买:
喜欢当当购物的朋友也可以点击链接直接下单:
(0)

相关推荐