DAX:【翻译】ALLSELECTED 教程

原文是:The definitive guide to ALLSELECTED

ALLSELECTED 可以返回一个表,也可以删除过滤器并恢复以前的过滤器上下文。 在这两种情况下,它都是通过使用迭代器在过滤器上下文堆栈上留下的最后一个影子过滤器上下文来实现的。

一,ALLSELECTED函数的用法

ALLSELECTED 函数的用法:作为一个表值函数或者CALCULATE函数的调节器。

在继续之前,我们需要回答一个重要的问题:ALLSELECTED 是一个表函数,还是像 KEEPFILTERS 和 USERELATIONSHIP 那样充当 CALCULATE 修饰符? 答案是它显示了这两种行为,具体取决于参数的数量和使用它的上下文。 实际上,ALLSELECTED 可以与三个不同的参数一起使用:表、列或根本没有参数,如以下几个示例所示:

AllSelectedColumn :=
CALCULATE (
    [SalesAmount],
    ALLSELECTED ( Customer[Occupation] )
)
 
AllSelectedTable :=
CALCULATE (
    [SalesAmount],
    ALLSELECTED ( Customer )
)
 
AllSelectedAll :=
CALCULATE (
    [SalesAmount],
    ALLSELECTED ()
)

下图显示了这三个度量在包含产品类别、客户性别和客户职业的矩阵中使用时的结果:

重要说明:Power BI 中的矩阵和 Excel 中的数据透视表使用等效于 DAX 迭代器来评估每个单元格的度量,该迭代器评估用户界面行和列中使用的每个属性组合的度量。 这对于本文的其余部分很重要。

这些示例将 ALLSELECTED 显示为 CALCULATE 修饰符,尽管如此,ALLSELECTED 也可以用作表函数,如以下代码所示:

AllSelectedCustomerSales :=
SUMX (
    ALLSELECTED ( Customer ),
    [SalesAmount]
)

当用作表函数时,ALLSELECTED 按照下面解释的规则返回表的子集或列的值的子集。 另一方面,当不带参数使用时,如以下代码所示,ALLSELECTED 只能用作 CALCULATE 修饰符:

AllSelectedSales :=
CALCULATE (
    [SalesAmount],
    ALLSELECTED ()
)

目前,重点是与表或列一起使用时的 ALLSELECTED - 稍后我们将介绍不带参数的 ALLSELECTED,这种情况仅用作 CALCULATE 修饰符。 在对 ALLSELECTED 进行更深入的分析之前,我们需要介绍影子过滤上下文,因为它们在 ALLSELECTED 的描述中至关重要

二,介绍影子筛选上下文

影子过滤上下文是由迭代器创建的一种特殊类型的过滤上下文,在初始状态下,影子过滤上下文是不活动的。不活动的过滤器上下文只是保持休眠状态,并且不会以任何方式影响代码行为。 尽管如此,它仍然存在,而且对于本文而言它很重要,因为 ALLSELECTED 在其执行过程中激活影子过滤器上下文。
我们考虑以下DAX代码:

SalesAmount :=
SUMX (
    Sales,
    Sales[Quantity] * Sales[Net Price]
)

作为一个迭代器,SUMX 生成一个包含 Sales 表的影子过滤器上下文。它不包含整个 Sales 表,像往常一样,它只包含在当前过滤器上下文中可见的行。 作为影子过滤器上下文,它是不活动的。 因此,过滤器上下文不会影响计算,这就是影子过滤器上下文很少被讨论的原因。 为了证明这一点,我们看下面的代码,它的行为符合预期。 它的结果是总销售量乘以颜色数。 缺少调用 SUM 的上下文转换是有意的:

WrongSalesAmount :=
SUMX (
    VALUES ( Product[Color] ),
    SUM ( Sales[Quantity] )
)

在迭代期间,Color 上的行上下文不会转换为过滤器上下文,因为没有 CALCULATE 执行上下文转换。正如这里所解释的,确实存在一个过滤器上下文:“影子”过滤器上下文。影子过滤器上下文包括迭代器启动时在当前过滤器上下文中处于活动状态的颜色列表。实际上,阴影过滤器上下文在迭代期间是不活动的,除非它被一个函数打开 - 即 ALLSELECTED。换句话说,当不使用 ALLSELECTED 时,忽略影子过滤上下文的存在是安全的。另一方面,当用户决定利用 ALLSELECTED 时,影子过滤器上下文至关重要。

细心的读者可能会注意到,如果影子过滤器上下文处于活动状态,它就不会改变结果。事实上,阴影过滤器上下文包含所有颜色,结果与原始过滤器上下文完全相同。但是,使用如下更精细的表达式,复杂性开始增加:

AnotherSalesAmount :=
SUMX (
    CALCULATETABLE (
        VALUES ( Product[Color] ),
        Product[Color] = "Red"
    ),
    SUM ( Sales[Quantity] )
)

在这种情况下,影子过滤器上下文包含一个颜色——即只有红色。 但是在迭代中,SUM (Sales[Quantity]) 仍然计算所有销售额的总和。 如果影子过滤器上下文处于活动状态,那么引擎只会对红色销售额求和。

在本文中,我们将普通过滤器(即非影子过滤器)称为显式过滤器,其唯一目的是在需要时区分显式过滤器和影子过滤器。
现在我们了解了影子过滤器上下文,我们可以开始分析 ALLSELECTED 对样本数据的行为。

三,举个例子

我们使用一个只有九行三列的表格:产品、品牌和颜色:

在这个表上,我们使用一个外部的 CALCULATETABLE 来过滤一些颜色和品牌。 我们还应用了一个不寻常的度量 ListProductNames。 ListProductNames 使用 CONCATATENATEX 返回当前筛选上下文中可见的产品名称列表,该度量的目的是让我们分析 ALLSELECTED 的结果(当用作表函数时)和表的结果(当 ALLSELECTED 用作 CALCULATE 修饰符时)。

DEFINE
    MEASURE Product
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悦光阴

你的鼓励是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值