首先,在使用本文的内容之前,请必须理解我们之前发布的日期表模型,但在实际企业环境中,我们肯定面对更复杂的场景,尤其是大型规范企业,有自己的标准,例如:财年,运营月,运营周。
于是,我们需要一张更牛的日期表,例如:
您可点击上述图片以便放大查看。
概念说明
非专业解释,但不影响本模型的正确计算。
财年
我国,一个财年是从每年的一月一日到十二月三十一日;
国际,有国家是从每年的六月一日到第二年的五月三十一日,以及从每年的九月一日到第二年的八月三十一日;
美国,政府的财年是从十月一日到九月三十日,但美国很多企业的财年是从七月一日到六月三十日。
至少说明,每个财年截止日期与自然年可能是不同的。
例如:如果某个企业的财年日期是 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,也就得到如下通用需求:
如果用户选择了某时间点,就按该时间点计算;否则,如果用户没有做选择,则按照最新日期计算相关内容。