DAX 过滤器上下文

DAX Filter context

我想知道这两个 DAX 表达式之间有什么区别,每个 return 我需要什么:

(1) =calculate([PctMkt], FILTER ( ALL ( BondDim), BondDim[Quality] = "HY" )) 
(2) =calculate([PctMkt], ALL(BondDim), BondDim[Quality] = "HY" )

DAX 引擎是否使这两个表达式等价? (2) 只是 (1) 的缩写吗?另外, (1) 会计算得更快吗?试图通过“破解”计算的度量来确保我不会在枢轴 table 中造成问题。这些措施允许用户向下钻取到较低的粒度,同时在数据透视 table.

的上下文中保留较高级别的数据

第二个

CALCULATE (
    [PctMkt],
    ALL ( BondDim ),
    BondDim[Quality] = "HY"
)

被DAX内部展开为等价公式

CALCULATE (
    [PctMkt],
    ALL ( BondDim ),
    FILTER (
        ALL ( BondDim[Quality] ),
        BondDim[Quality] = "HY"
    )
)

所以和第一个不一样

CALCULATE (
    [PctMkt],
    FILTER (
        ALL ( BondDim ),
        BondDim[Quality] = "HY"
    )
)

区别在于第一个使用整个 BondDim table 作为过滤器,而第二个仅使用相同 table

的一列

一个更简单的类似问题是众所周知的。

CALCULATE (
    [PctMkt],
    BondDim[Quality] = "HY"
)

is the shortened equivalent of

CALCULATE (
    [PctMkt],
    FILTER (
        ALL ( BondDim[Quality] ),
        BondDim[Quality] = "HY"
    )
)

您的公式需要多加考虑。

当 ALL 用作 CALCULATE 的参数时,它仅删除过滤器(如 REMOVEFILTERS)而不是作为 table 表达式。

ALL ( < table > )作为FILTER的参数时,必然是table表达式。

我给出的第一个 link 给出了一个详细的例子,说明这种区别如何产生重要的区别。我将在这里提供另一个示例:

假设 MarketDim 与来自 ID 列的 BondDim 具有一对多关系(并且 不是 双向关系)每个和 table 如下:

  BondDim          MarketDim

Quality   ID       ID    Pct
-------------      ----------
HY        1         1    5%
VY        1         2    10%
XY        2         3    20%

假设[PctMkt] := MAX ( MarketDim[Pct] )

然后,在您的第一个公式 (1) 中,FILTER 参数如下 table:

Quality  ID
-------------
HY       1

因此,(1)的结果只能是5%(或空白),因为ID = 1是唯一的选择。

在您的第二个公式 (2) 中,没有 table 个参数,因为 ALL ( BondDim ) 仅删除过滤器,而 BondDim[Quality] = "HY" 仅作用于单个列。没有 table 参数,因为 MarketDim 过滤器 BondDim 但反之则不然(因为它是单向关系),这些列过滤器参数对我定义的度量没有任何影响(不过,它可能取决于您的实际尺寸)。

因此,(2) 的结果与 CALCULATE ( [PctMkt] ) 相同,它将是 20%,除非对 MarketDim 进行过滤以排除 ID = 3 ].

注意:如果 [PctMkt]BondDim 列或由 BondDim你的模型。 IE。过滤器在关系中传播“下游”而不是“上游”。