【DAX 系列】PowerBI 日期表模型 - 支持财年与运营月运营周

2020-02-26 11:45:32 浏览数 (1)

首先,在使用本文的内容之前,请必须理解我们之前发布的日期表模型,但在实际企业环境中,我们肯定面对更复杂的场景,尤其是大型规范企业,有自己的标准,例如:财年,运营月,运营周。

于是,我们需要一张更牛的日期表,例如:

您可点击上述图片以便放大查看。

概念说明

非专业解释,但不影响本模型的正确计算。

财年

我国,一个财年是从每年的一月一日到十二月三十一日;

国际,有国家是从每年的六月一日到第二年的五月三十一日,以及从每年的九月一日到第二年的八月三十一日;

美国,政府的财年是从十月一日到九月三十日,但美国很多企业的财年是从七月一日到六月三十日。

至少说明,每个财年截止日期与自然年可能是不同的。

例如:如果某个企业的财年日期是 0630,则20190701到20200630是2020财年,或19/20财年。

例如:奥巴马向国会提交2011财年预算指出:报告预测2010年的财政赤字将达到创纪录的1.56万亿元;预计2011财年的赤字仍高达1.27万亿美元。这里的就是始于2010年10月1日、终于2011年9月30日的2011财经年度预算。

运营月截止日

由于运营的需要,一个月的月初或月末需要开会总结或做计划,这样就导致一个统计周期可能不是按照自然月,而是一个自定义的数字,如果每月25日开始到次月24日结束为一个运营月。

运营周截止日

由于运营的需要,一个周的周初或周末需要开会总结或做计划,这样就导致一个统计周期可能不是按照自然周,而是一个自定义的数字,如果每周5日开始到次周4日结束为一个运营周。

自然日期从属的区间

计算

通常,我们面对如下需求:

给定一个日期:

  • 返回该日期的上个运营周总销售额
  • 返回该日期的当前运营月总销售额
  • 返回该日期的上个完整财年销售额

日期表模板

以下直接给出日期表模板,直接使用:(限于篇幅,会员视频提供更多讲解)

代码语言:javascript复制
Model.DatesTemplate =

VAR BeginDate   = MINX( {

    MIN( '订单'[订单日期] ) ,   // 【配置】根据实际修改
    MIN( '订单'[发货日期] )     // 【配置】根据实际修改

} , [Value] )

VAR EndDate     = MAXX( {

    MAX( '订单'[订单日期] ) ,   // 【配置】根据实际修改
    MAX( '订单'[发货日期] )     // 【配置】根据实际修改

} , [Value] )

VAR vFiscalDate             = "1231" // 文本"1231" 设置 "0630" 表示 6月30日

VAR vOperateEndDayInMonth   = 31 // 数字31 设置 1 ... 31

VAR vOperateEndDayInWeek    = 7  // 数字7 设置 1 ... 7

VAR vDateLine =

    CALENDAR(
        DATE( YEAR( BeginDate ) - IF( vFiscalDate <>"1231" , 1 )  ,   1  ,    1  ) ,
        DATE( YEAR( EndDate )     IF( vFiscalDate <>"1231" , 1 )  ,   12 ,    31 )
    )

VAR vBeginDate = MINX( vDateLine , [Date] )

VAR vCalendar =
ADDCOLUMNS(
    vDateLine ,
    "索引" , VALUE( [Date] - vBeginDate ) ,
    "全局周序号" ,  INT( ( VALUE( [Date] - vBeginDate )   7 - WEEKDAY( [Date] , 2 ) ) / 7 ) ,
    "年序号" , YEAR( [Date] ) ,
    "年名称" , "Y" & YEAR( [Date] ) ,
    "季序号" , VALUE( FORMAT( [Date] , "Q" ) ) ,
    "季名称" , "Q" & FORMAT( [Date] , "Q" ) ,
    "年季序号" , YEAR( [Date] ) * 10   QUARTER( [Date] ) ,
    "月序号" , MONTH( [Date] ) ,
    "月名称(英文)" , FORMAT( [Date] , "mmm" ),
    "月名称" , MONTH( [Date] ) & "月",
    "年月序号" , YEAR( [Date] ) * 100   MONTH( [Date] ) ,
    "周序号" , WEEKNUM( [Date] , 2 ) ,
    "年周序号" , YEAR( [Date] ) * 100   WEEKNUM( [Date] , 2 ) ,
    "月第几日" , DAY( [Date] ) ,
    "周第几日" , WEEKDAY( [Date] , 2 ),
    "星期几" , RIGHT( FORMAT( [Date] , "aaa" ) , 1 ),
    "年第几日" , VALUE( FORMAT( [Date] , "y" ) )
)

VAR vFiscalMonth = IF( LEN( vFiscalDate ) = 4 , VALUE( LEFT( vFiscalDate , 2 ) ) , ERROR( "财务日期必须是4位文本,如:0630表示6月30日" ) )
VAR vFiscalDay   = VALUE( RIGHT( vFiscalDate , 2 ) )

VAR vCalendarExtend =
ADDCOLUMNS( vCalendar ,
    "财务年序号" ,
         VAR vFiscalEndDatePY = DATE( [年序号], vFiscalMonth , vFiscalDay )
         RETURN IF( [Date] > vFiscalEndDatePY  , [年序号]   1 , [年序号] )  ,

    "运营年月序号" ,
        IF( [月第几日] > vOperateEndDayInMonth  , YEAR( EOMONTH( [Date] , 1 ) ) * 100   MONTH( EOMONTH( [Date] , 1 ) ) , [年月序号] )
        ,

    "运营周序号" ,
        IF( [周第几日] > vOperateEndDayInWeek  , [全局周序号]   1 , [全局周序号] )
)

VAR vCalendarExtend2 =
ADDCOLUMNS( vCalendarExtend ,
    "财务年名称" , "FY" & RIGHT( [财务年序号] - 1 , 2 ) & RIGHT( [财务年序号] , 2 ),
    "上个财务年序号" , [财务年序号] - 1 ,
    "上个运营年月序号" , IF( MOD( [运营年月序号] , 10 ) > 1 , [运营年月序号] - 1 , ( VALUE( LEFT( [运营年月序号] & "" , 4 ) ) - 1 ) * 100   12 ) ,
    "上个运营周序号" , [运营周序号] - 1
)

RETURN vCalendarExtend2

没错,直接复制以上内容并在 PowerBI 中粘贴即可新建一个日期表。当然需要注意:在使用本文的内容之前,请必须理解我们之前发布的日期表模型。

后续

通常,用户可能需要查看最近运营月或运营周的KPI,也就得到如下通用需求:

如果用户选择了某时间点,就按该时间点计算;否则,如果用户没有做选择,则按照最新日期计算相关内容。

0 人点赞