无日期上下文的本月至今的同比环比 | 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)
)
)
下面看看利用时间智能函数的写法:
收入 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)},'日期表'[日期]))
)
其结果和前面的写法完全一样:
这里就灵活运用了日期函数和时间智能函数,实现了无外部上下文的各种计算。
本文用到的这几个度量值,值得你去细细理解了其中的逻辑,将加深你对日期函数和时间智能函数的理解,掌握这个思路以后,以后碰到类似的分析时都可以利用这类函数轻松计算。