遇到的问题
公司里常常遇到MTD的同比环比分析,但是Power BI中的 Dateadd 和 DatesMTD 都会有个问题,就是这两个函数所计算出来的同比是 MOM (Month - over - month 月对比)以及环比是PMC(Previous month complete上月整月)。而实际上我们需要的是PYMTD以及PMMTD(Previous month to date)。
简单地说,就是,本月MTD的计算日期区间是 2022年2月1日—— 2022年2月15日,那么:
- 同比日期区间:2021年2月1日——2021年2月15日
- 环比日期区间:2021年12月1日——2021年12月15日
当然,同比环比还会遇到对比月的天数不同之类的问题。但是这个问题用IF语句很容易解决,所以这篇文章内就不用描述了。
主要描述一下,同比环比相同Day区间的问题。
解决问题
首先是事实表和Calendar表连接,这个很简单,就是事实表的[Billing Date]和Calendar表的[Date]字段进行连接。

其次,就是DAX,其中MTD.VOL是本月的Volume求和。
环比=
CALCULATE (
[MTD.VOL],
FILTER (
ALL ( 'Calendar'[Date] ),
'Calendar'[Date]
//EOMONTH:返回指定月份数之前货之后的月份的最后一天的日期。
>= EOMONTH ( MIN ( DSR_LY[Billing Date] ), -2 ) + 1
//EDATE:返回在开始日期之前或之后指定月份数的日期
&& 'Calendar'[Date] <= EDATE ( MAX ( DSR_LY[Billing Date] ), -1 )
)
)
这里的EOMONTH简单地说,就是返回当前选择月之前(-X)或者之后(+X)月的最后一天的日期。
例如MTD是2022年2月,那么EOMONTH第二个参数如果是 -2 ,就意味着向前两个月,也就是返回2021年12月的最后一天。又因为我要算的是环比,也就是前一个月的第一天到MTD的最后一天的上月同日。所以我用EOMONTH算出来2021年12月31日,然后+1,就是2022年1月1日,也就是2022年2月环比月的第一天。
然后是EDATE,EDATE其实很容易理解,就是和EOMONTH以及DATEADD的第二参数一样的功能,就是选择月之前(-X)或者之后(+X)月的第一参数日期的Day。
和环比相同,同比也是用类似的DAX完成如下:
CALCULATE (
[MTD.VOL],
FILTER (
ALL ( 'Calendar'[Date] ),
'Calendar'[Date]
>= EOMONTH ( MIN ( DSR_LY[Billing Date] ), -13 ) + 1
&& 'Calendar'[Date] <= EDATE ( MAX ( DSR_LY[Billing Date] ), -12 )
)
)
和环比不同的点只是EOMONTH和EDATE之前的月数量不同。