CALENDARAUTO函数是SQLServer 2016新增添的函数之一,Analysis Services (SSAS)、 Excel 2016的Power Pivot, 和Power BI Desktop中都包含了该函数。CALENDARAUTO函数返回一个命名为“Date”包含一组连续日期数据的单一列日期表,它可基于数据模型数据自动计算日期范围(具体如何使用该函数可查阅微软官网有关使用参考,目前仅有英文注释)。有了该函数在众多为数据模型创建日期表的方法中又增添了一种方式。
其实Analysis Services和Power BI Desktop中均可通过计算表功能,由CALENDARAUTO函数生成一个单列的日期表。Excel 2016的Power Pivot中因还没有创建计算表功能,实际无法直接在Power Pivot环境下生成日期表,而需通过DAX在Excel中的查询方式,再由Excel链接表来生成日期表,该方式显然没有AnalysisServices和Power BI Desktop中使用CALENDARAUTO函数创建日期表那么快捷方便。
使用CALENDARAUTO函数创建日期表需要有一个与日期时间相关的数据表模型,比如我们所称的事实表模型(业务数据表),它每笔业务均与日期时间关联,就像AdventureWork示例文件中的表格FactInternetSales。有了事实表CALENDARAUTO函数在Analysis Services和Power BI Desktop中,通过计算表功能就能自动计算出日期数据表模型了。CALENDARAUTO函数具体如何实施创建日期表在这里不作描述。
下面是通过DAX 编写的由CALENDARAUTO函数在数据模型中自动创建Date表的示例,该示例摘自于微软Power BI社区。可以看出DAX函数参数fiscal_year_end_month非常重要,该示例通过fiscal_year_end_month的设定动态调整财年及财年季度有关数据。
DimDate =
VAR fiscal_year_end_month =6
RETURN
ADDCOLUMNS (
CALENDARAUTO ( fiscal_year_end_month ),
"DateAsInteger", FORMAT ([Date], "YYYYMMDD" ),
"Year", YEAR ( [Date] ),
"Fiscal Year", IF (
MONTH ( [DATE] ) <=fiscal_year_end_month,
YEAR ( [DATE] ) - 1,
YEAR ( [DATE] )
),
"Quarter", "Q"& FORMAT ( [Date], "Q" ),
"Fiscal Quarter","Q"
& FORMAT (
IF (
fiscal_year_end_month <MONTH ( [Date] ),
DATE ( YEAR ( [Date] ),MONTH ( [Date] ) - fiscal_year_end_month, 1 ),
DATE ( YEAR ( [Date] ) - 1,MONTH ( [Date] ) + 12 - fiscal_year_end_month, 1 )
),
"Q"
),
"YearQuarter", FORMAT ([Date], "YYYY" ) & "/Q"
& FORMAT ( [Date],"Q" ),
"Fiscal YearQuarter", IF (
MONTH ( [DATE] ) <=fiscal_year_end_month,
YEAR ( [DATE] ) - 1,
YEAR ( [DATE] )
)
& "/Q"
& FORMAT (
IF (
fiscal_year_end_month <MONTH ( [Date] ),
DATE ( YEAR ( [Date] ),MONTH ( [Date] ) - fiscal_year_end_month, 1 ),
DATE ( YEAR ( [Date] ) - 1,MONTH ( [Date] ) + 12 - fiscal_year_end_month, 1 )
),
"Q"
),
"Monthnumber", FORMAT ([Date], "MM" ),
"YearMonthnumber", FORMAT ([Date], "YYYY/MM" ),
"YearMonthShort", FORMAT ([Date], "YYYY/mmm" ),
"MonthNameLong", FORMAT ([Date], "mmmm" ),
"MonthNameShort", FORMAT ([Date], "mmm" ),
"DayOfWeekNumber", WEEKDAY ([Date] ),
"DayOfWeek", FORMAT ( [Date],"dddd" ),
"DayOfWeekShort", FORMAT ([Date], "ddd" )
)
根据函数CALENDARAUTO语法, fiscal_year_end_month可返回一个1—12整数值,若忽略该值其为当前用户的 日历表模板中指定的 值。上述DAX表达式若想要返回的财年与自然年一致,参数fiscal_year_end_month可设定为:fiscal_year_end_month = BLANK( )
|