Power Pivot 特殊结算日期及财年日期
传送门:https://jiaopengzi.com/236.html
1、背景
前几天看到群里有朋友在搞特殊结算日期,主要不是按照正常日期里的整月,按照比如:上月21号至本月20号作为结算周期,由于这样的结算日期,无法使用pp里面的时间智能函数。
pp内置了很多时间智能函数,但是都无法满足需求,dax只要你创建上下文即可满足业务需求,今天就简单写个这样的度量值。
2、数据源
calendar表
2017/1/1-2018/12/31
fact表
2017/1/1-2018/12/31的随机value
关系建立
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 )结果图

请关注
- 
mtd中2017年1月(1月1日-1月31日),即蓝色单元格; 
- 
mtd2中2017年1月(1月1日-1月20日),即黄色单元格; 
- 
mtd2中2017年2月(1月21日-2月20日),即橙色单元格(颜色如果不是橙色也暂且叫做橙色吧); 
- 
2017年6月中ytd_1231、ytd_0630都是相等,即红色字体单元格; 
- 
2017年7月中ytd_1231、ytd_0630不相等,即 
 绿色单元格:datesytd第二参数中,ytd_1231按照12月31日为结算年末,
 红色单元格:datesytd第二参数中,ytd_0630按照6月30日为结算年末。
4、总结
- 好像没啥总结的;
- datesytd注意第二参数的使用,主要是结算或者财年使用;
- 特殊结算周期,根据业务特点创建DAX上下文即可。
by 焦棚子
自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
 
         
       
                         
                         
       
       
            