使用聚合迭代器函数

已完成

每个单列汇总函数都有其等效的迭代器函数。 当迭代器函数有用时,以下各部分将考虑两种聚合方案:复杂汇总和更高粒度汇总。

复杂汇总

在本部分中,你将创建使用迭代器函数的第一个度量值。 首先,下载并打开 Adventure Works DW 2020 M05.pbix 文件。 接下来,添加以下度量值定义:

Revenue =
SUMX(
    Sales,
    Sales[Order Quantity] * Sales[Unit Price] * (1 - Sales[Unit Price Discount Pct])
)

将收入度量值格式化为带有两个小数位数的货币,然后将其添加到位于报表第 1 页上的表视觉对象。

图像显示具有两个列的表视觉对象:月份和收入。显示一年的数据值。

通过使用迭代器函数,收入度量值公式聚合的值超出了单个列的值。 对于每个行,它使用三列的行上下文值来产生收入金额。

现在,添加另一个度量值:

Discount =
SUMX(
    Sales,
    Sales[Order Quantity]
    * (
        RELATED('Product'[List Price]) - Sales[Unit Price]
    )
)

将折扣度量值格式化为带有两个小数位数的货币,然后将其添加到表视觉对象。

图像显示具有三个列的表视觉对象:月份、收入和折扣。显示一年的数据值。

请注意,公式使用 RELATED 函数。 请记住,行上下文不会超出表的范围。 如果公式需要引用其他表中的列,并且这些表之间存在模型关系,则对单端关系使用 RELATED 函数,对多端关系使用 RELATEDTABLE 函数。

更高粒度汇总

下面的示例考虑了报表平均收入的要求。 添加下面的度量值:

Revenue Avg =
AVERAGEX(
    Sales,
    Sales[Order Quantity] * Sales[Unit Price] * (1 - Sales[Unit Price Discount Pct])
)

将收入平均度量值格式化为带有两个小数位数的货币,然后将其添加到表视觉对象。

图像显示具有四个列的表视觉对象:月份、收入、折扣和收入平均值显示一年的数据值。

请考虑平均值意味着值的总和除以值的计数。 但这一理论会引发以下问题:值的计数表示什么? 在这种情况下,值的计数是未计算为 BLANK 的表达式的数量。 此外,由于迭代器函数枚举 Sales 表行,平均值意味着每行的收入。 将此逻辑更进一步,因为 Sales 表中的每一行都记录一个销售订单行,它可以被更准确地描述为每个订单行的收入。

相应地,应将平均收入度量值重命名为平均收入订单行,以便可以清楚地向用户报告什么是平均基准。

下面的示例使用迭代器函数来创建一个新的度量值,该度量值将提升销售订单级别(销售订单由一个或多个订单行构成)的粒度。 添加下面的度量值:

Revenue Avg Order =
AVERAGEX(
    VALUES('Sales Order'[Sales Order]),
    [Revenue]
)

将平均收入订单度量值格式化为带有两个小数位数的货币,然后将其添加到表视觉对象。

图像显示具有五个列的表视觉对象:月份、收入、折扣、平均收入订单行和平均收入订单。显示一年的数据值。

按照预期,订单的平均收入始终高于单个订单行的平均收入。

请注意,公式使用 VALUES DAX 函数。 此函数可让你的公式确定筛选器上下文中的值。 在这种情况下,此 AVERAGEX 函数将循环访问筛选器上下文中的每个销售订单。 换句话说,它会循环访问该月的销售订单。 筛选器上下文和 VALUES 函数在筛选器上下文模块中引入。