首发于power系列

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

焦棚子的文章目录

请点击下载附件

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 )

结果图

结果图
透视表

请关注

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 焦棚子


焦棚子的文章目录

编辑于 03-01

文章被以下专栏收录