使用 DAX 时间智能函数

已完成

DAX 包含多个时间智能函数,以简化修改日期筛选器上下文的任务。 可以通过使用修改日期筛选器的 CALCULATE 函数编写其中多个智能公式,但这样做会产生更多工作。

注意

许多 DAX 时间智能函数与标准日期周期(具体为年、季度和月)相关。 如果你有一些不规则的时间段(例如,从日历月中间开始的财务月份),或需要处理周或时间段(小时、分钟等等),则 DAX 时间智能函数将不起作用。 相反,你需要使用 CALCULATE 函数并传入手动制定的日期或时间筛选器。

日期表要求

若要使用时间智能 DAX 函数,需要满足在模型中至少具有一个日期表的先决条件模型要求。 日期表是满足以下要求的表:

  • 它必须有一个数据类型为日期(或日期/时间)的列(称为“日期列”)。
  • 日期列必须包含唯一值。
  • 日期列不能包含空白。
  • 日期列不能缺少任何日期。
  • 日期列必须跨越全部年份。 年份不一定是日历年(1 月 - 12 月)。
  • 此日期表必须表示为日期表。

有关详细信息,请参阅 Power BI Desktop 中的日期表

在一段时间内汇总

一组 DAX 时间智能函数与一段时间的汇总相关:

  • DATESYTD - 返回一个单列表,其中包含当前筛选器上下文中的本年迄今 (YTD) 的日期。 此组还包括针对本月至今 (MTD) 和本季度至今 (QTD) 的 DATESMTDDATESQTD DAX 函数。 可以将这些函数作为筛选器传递到 CALCULATE DAX 函数。
  • TOTALYTD - 计算当前筛选器上下文中 YTD 的表达式。 还包括 TOTALQTDTOTALMTD 的等效 QTD 和 MTD DAX 函数。
  • DATESBETWEEN - 返回一个表,该表包含由日期构成的一列,这些日期从给定的开始日期开始,并一直持续到给定的结束日期。
  • DATESINPERIOD - 返回一个表,该表包含由日期构成的一列,这些日期从给定的开始日期开始,并持续指定数量的间隔时间。

注意

尽管 TOTALYTD 函数简单易用,但只能传入一个筛选表达式。 如果需要应用多个筛选表达式,请使用 CALCULATE 函数,然后将 DATESYTD 函数作为一个筛选表达式传入。

在下面的示例中,将创建第一次使用 TOTALYTD 函数的智能计算。 语法如下:

TOTALYTD(<expression>, <dates>, [, <filter>][, <year_end_date>])

函数需要表达式,和所有时间智能函数一样,还需要对标记日期表日期列的引用。 (可选)可以传入一个筛选表达式或年度结束日期(仅当年份未截止到 12 月 31 日时才是必需的)。

下载并打开 Adventure Works DW 2020 M07.pbix 文件。 然后,将以下度量值定义添加到用于计算 YTD 收入的 Sales 表中。 将此度量值的格式设置为带有两个小数位数的货币。

Revenue YTD =
TOTALYTD([Revenue], 'Date'[Date], "6-30")

"6-30" 的年度结束日期值表示 6 月 30 日。

在报表第 1 页,将“收入 YTD”度量值添加到矩阵视觉对象。 请注意,它将生成从年初到已筛选月份的收入金额的汇总。

图像显示一个矩阵视觉对象,其中包含“年份”和“月份”行组,以及“收入”和“收入 YTD”汇总。将突出显示 YTD 值。

在一段时间内比较

另一组 DAX 时间智能函数与转换时间段相关:

  • DATEADD - 返回一个表,该表包含由日期构成的一列,这些日期是在时间上从当前筛选器上下文中的日期前移或后移指定间隔数目的日期。
  • PARALLELPERIOD - 返回一个表,该表包含由日期构成的一列,这些日期表示与当前筛选器上下文中指定的日期列中的日期并行的期间,该列中具有在时间上前移或后移某个数目的间隔的日期。
  • SAMEPERIODLASTYEAR - 返回一个表,该表包含由日期构成的一列,这些日期是在时间上从当前筛选器上下文中指定的日期列中的日期移回一年的日期。
  • 许多 helper DAX 函数用于在特定时间段向后或向前导航,所有这些函数都将返回一个日期表。 这些 helper 函数包括 NEXTDAYNEXTMONTHNEXTQUARTERNEXTYEAR 以及 PREVIOUSDAYPREVIOUSMONTHPREVIOUSQUARTERPREVIOUSYEAR

现在,你将使用 SAMEPERIODLASTYEAR 函数向 Sales 表添加一个用于计算上年度收入的度量值。 将此度量值的格式设置为带有两个小数位数的货币。

Revenue PY =
VAR RevenuePriorYear = CALCULATE([Revenue], SAMEPERIODLASTYEAR('Date'[Date]))
RETURN
    RevenuePriorYear

将“收入 PY”度量值添加到矩阵视觉对象。 请注意,它生成的结果与上年度收入金额类似。

图像显示了一个矩阵视觉对象,其中包含“年份”和“月份”行组以及“收入”、“收入 YTD”和“收入 PY”汇总。2019 财年的月收入 PY 值等于 2018 财年的月收入值。

接下来,你将修改该度量值,方法是将其重命名为“年收入 YoY 百分比”,然后更新 RETURN 子句以计算变化率。 请确保将格式更改为带有两个小数位数的百分比。

Revenue YoY % =
VAR RevenuePriorYear = CALCULATE([Revenue], SAMEPERIODLASTYEAR('Date'[Date]))
RETURN
    DIVIDE(
        [Revenue] - RevenuePriorYear,
        RevenuePriorYear
    )

请注意,“收入 YoY 百分比”度量值将产生相对上年度月收入的变化系数的比率。 例如,2018 年 7 月相对上年度月收入增加了 106.53%,而 2018 年 11 月相对上年度月收入下降了 24.22%。

图像显示了一个矩阵视觉对象,其中包含“年份”和“月份”行组以及“收入”、“收入 YTD”和“收入 YoY 百分比”汇总。2019 财年“收入 YoY 百分比”月度值是格式为百分比的值。

注意

“收入 YoY 百分比”度量值展示了对 DAX 变量的合理使用。 度量值提高了公式的可读性,并允许对部分度量值逻辑进行单元测试(通过返回 RevenuePriorYear 变量值)。 此外,该度量值是最佳公式,因为它不需要重复检索上年度的收入值。 如果将它存储在变量中一次,则 RETURN 子句将使用变量值两次。