Power Pivot 特殊结算日期及财年日期

传送门https://zhuanlan.zhihu.com/p/48229306
需要附件请在评论区留下邮箱。

1、背景

前几天看到群里有朋友在搞特殊结算日期,主要不是按照正常日期里的整月,按照比如:上月21号至本月20号作为结算周期,由于这样的结算日期,无法使用pp里面的时间智能函数。

pp内置了很多时间智能函数,但是都无法满足需求,dax只要你创建上下文即可满足业务需求,今天就简单写个这样的度量值。

2、数据源

calendar表
2017/1/1-2018/12/31

fact表
2017/1/1-2018/12/31的随机value
file

关系建立
file

3、上DAX

total

total:=SUM('fact'[value])

ytd_1231
按照每年12月31号为结算年末的ytd,注意观察datesytd第二参数:"12-31"

ytd_1231:=CALCULATE('fact'[total],DATESYTD('calendar'[date],"12-31"))

ytd_0630
按照每年6月30号为结算年末的ytd,注意观察datesytd第二参数:"06-30"

ytd_0630:=CALCULATE('fact'[total],DATESYTD('calendar'[date],"06-30"))

mtd
按照正常整月的mtd

mtd:=CALCULATE('fact'[total],DATESMTD('calendar'[date]))

mtd2
1、按照结算周期(上月21日-本月20日,其中D是参数可以更改为自己需求)的mtd,可以看月纬度及天纬度;
2、考虑闰年2月29天因素
3、由于本案例中只存在2017年以后数据,2017年1月mtd即是1月1日-1月20日之间

mtd2:=
VAR D = 20//D设置为参数,D的范围应该在(1,28)
VAR MP =
    COUNTROWS ( PREVIOUSMONTH ( 'calendar'[date] ) )
VAR MSD =
    STARTOFMONTH ( 'calendar'[date] )
VAR N =
    SWITCH (
        TRUE (),
        MP = 31, D - 31,
        MP = 30, D - 30,
        MP = 29, D - 29,
        MP = 28, D - 28
    )
VAR SD =
    IF (
        ISFILTERED ( 'calendar'[date] ),
        IF (
            DAY ( MAX ( 'calendar'[date] ) ) <= D,
            DATEADD ( MSD, N, DAY ),
            DATEADD ( MSD, D, DAY )
        ),
        DATEADD ( MSD, N, DAY )
    )
VAR ED =
    IF (
        ISFILTERED ( 'calendar'[date] ),
        MAX ( 'calendar'[date] ),
        DATEADD ( MSD, D - 1, DAY )
    )
VAR T =
    DATESBETWEEN ( 'calendar'[date], SD, ED )
RETURN
    CALCULATE ( 'fact'[total], T )

结果图
file
file

请关注

  1. mtd中2017年1月(1月1日-1月31日),即蓝色单元格;

  2. mtd2中2017年1月(1月1日-1月20日),即黄色单元格;

  3. mtd2中2017年2月(1月21日-2月20日),即橙色单元格(颜色如果不是橙色也暂且叫做橙色吧);

  4. 2017年6月中ytd_1231、ytd_0630都是相等,即红色字体单元格;

  5. 2017年7月中ytd_1231、ytd_0630不相等,即
    绿色单元格:datesytd第二参数中,ytd_1231按照12月31日为结算年末,
    红色单元格:datesytd第二参数中,ytd_0630按照6月30日为结算年末。

4、总结

  1. 好像没啥总结的;
  2. datesytd注意第二参数的使用,主要是结算或者财年使用;
  3. 特殊结算周期,根据业务特点创建DAX上下文即可。

by 焦棚子