标记为日期表是使用时间智能函数的一项准备工作,Excel 和 Power BI 都提供标记为日期表的功能,本文将介绍标记日期表的原因以及如何使用等效方案
如果表间关系是通过日期列定义的,时间智能函数可以正常工作,因为时间智能函数对日期表的日期列应用筛选器,自动覆盖日期表其他列的筛选条件。这也是为什么没有标记日期表,公式依然可以正常计值的原因。但是在某些情况下,你可能会基于其他列建立关系,比如有的日期表使用整数列建立关系,例如示例中的 Date[DateKey]。
Sales 和 Date 表之间的关系从 Date 列(日期类型),变更为 DateKey 列(整数类型)
DateKey 列包含格式为 YYYYMMDD 的整数值(例如,20080120 表示 2008 年 1 月 20 日),在这种情况下,标记为日期表的特性必须在日期表中处于激活状态,否则 Date[DateKey]列上的筛选器不会覆盖日期表上其他现有的活动筛选器。例如,考虑数据透视表如图 7-14 所示:度量值 Sales Amount Jan-Feb 2008 Single Column 没有达到预期的效果,因为它总是返回与初始度量值 Sale Amount 相同的值,只筛选 2008 年 1 月和 2 月的数据(如果外部上下文中不包括这些日期则返回空白)。
图 7-14 Sales Amount Jan-Feb 2008 Single Column 不会将所选内容扩展到报表中的行选择之外的日期,因为它不会替换年份和月份的现有筛选器
这种现象的原因是日期表上有其他活动的筛选器,来自于数据透视表的行标签。例如,1 月和 2 月的行只显示每个月的值,而不是两者的总和,其他月份返回空白值,而并非无论选择任何日期都相同的重复值,
图 7-12 Sales Amount Jan-Feb 2008 始终显示 2008 年 1 月和 2 月的总和, 而不考虑行上的日期范围选择
如图 7-12 所示。如果你启用标记为日期表特性,并且指定日期列为’Date'[Date],那么当 CALCULATE 或 CALCULATETABLE 函数的筛选器参数使用来自这个日期列的筛选器时,DAX 将自动从日期表的所有其他列中删除筛选器。(这样做之后,你将得到与图 7-12 中相同的结果。)
考虑以下公式模板:
- CALCULATE (
- <expr>,
- 'Date'[Date] >= DATE ( 2008, 1, 1 )
- && 'Date'[Date] <= DATE ( 2008, 2, 29 ),
- <filter2>,
- ...
- <filterN>
- )
复制代码
对于使用整数列与模型建立关系的日期表,借助标记为日期表功能将关系列重新指定为日期类型的列之后,对于使用日期列作为筛选器参数的公式,DAX 将使用与下面的公式相同的技术移除相同表的任何已有筛选器:
- CALCULATE (
- <expr>,
- 'Date'[Date] >= DATE ( 2008, 1, 1 )
- && 'Date'[Date] <= DATE ( 2008, 2, 29 ),
- <filter2>,
- ...
- <filterN>,
- ALL ( 'Date' )
- )
复制代码
只有当你正确的使用了标记为日期表这个特性后,时间智能函数才会正常工作。
如果想在没有设置此特性的模型中定义与时间计算相关的度量值,你可以在 CALCULATE 函数中放置 ALL (‘Date’)作为筛选器参数,用来移除那些可能影响最终结果的,来自日期表其他列的筛选器
如果你定义这样一个筛选器参数,它迭代整个日期表而不是单列,新的日期筛选器将覆盖日期表上的任何现有的筛选上下文,ALL (‘Date’)也就不再需要了。例如,你可以用这种方式编写前面的公式模板,这样即使标记为日期表的设置未激活,公式仍然可以正常工作:
- CALCULATE (
- <expr>,
- FILTER (
- ALL ( 'Date' ),
- 'Date'[Date] >= DATE ( 2008, 1, 1 )
- && 'Date'[Date] <= DATE ( 2008, 2, 29 ),
- ),
- <filter2>,
- ...
- <filterN>
- )
复制代码 总结
标记为日期表可以自动移除来自日期表其他列的筛选器,这种特性非常重要。在 Excel 和 Power BI Desktop 中,你都可以找到标记为日期表功能。
|