使用 DAX 时间智能函数

已完成

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

注意

许多 DAX 时间智能函数使用标准日期期间,例如年、季度和月。 如果您有一些不规则的时间段(例如,与日历不匹配的财务月份),或需要使用周或更短的时间段,则内置的 DAX 函数将不起作用。相反,你需要使用 CALCULATE 函数并传入手动制定的日期或时间筛选器。 在这些情况下,将 CALCULATE 函数与自定义日期或时间筛选器结合使用。

日期表要求

若要使用时间智能 DAX 函数,您需要满足在模型中至少具有一个日期表 的先决条件模型要求。 日期表是标记为“Date”表的表。 该表必须具有数据类型为“日期”(或日期/时间)的列,称为日期列。 日期列必须:

  • 包含唯一值。
  • 跨越全部年份。
  • 不包含空值。
  • 没有任何缺失的日期。

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

在一段时间内汇总

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

  • DATESYTD - 返回一个单列表,其中包含当前筛选器上下文中的年初迄今 (YTD) 日期。 此组还包括针对本月至今 (MTD) 和本季度至今 (QTD) 的 DATESMTDDATESQTD 函数。 您可以将这些函数作为筛选器传递到 CALCULATE 函数。
  • 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 页上,将 Revenue YTD 度量值添加到矩阵视觉对象。 请注意,它将生成从年初到已筛选月份的收入金额的汇总。

屏幕截图显示一个矩阵视觉对象,其中按“Year”和“Month”以及“Revenue”和“Revenue YTD”汇总对行进行分组。突出显示了 YTD 值。

在一段时间内比较

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

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

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

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

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

屏幕截图显示一个矩阵视觉对象,其中按“Year”和“Month”以及“Revenue”、“Revenue YTD”和“Revenue PY”汇总对行进行分组。FY2019 的“Revenue PY”月值等于 FY2018 的“Revenue”月值。

接下来,您将通过将该度量值重命名为 Revenue YoY % 来修改它,然后更新 RETURN 子句以计算更改率。 请务必将格式更改为带有两个小数位数的百分比。

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

请注意,Revenue YoY % 度量值将产生相对上一年月收入的变化系数的比率。 例如,2018 年 7 月相对上一年月收入增加 了 106.53%,而 2018 年 11 月相对上一年月收入减少 了 24.22%。

屏幕截图显示一个矩阵视觉对象,其中按“Year”和“Month”以及“Revenue”、“Revenue YTD”和“Revenue YoY %”汇总对行进行分组。FY2019 的“Revenue YoY %”月值是格式化为百分比的值。

注意

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