首页 > 解决方案 > DAX 筛选器上下文

问题描述

我想知道这两个 DAX 表达式之间有什么区别,每个表达式都返回我需要的内容:

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

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

标签: excelexcel-formulapowerbidaxpowerpivot

解决方案


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

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

是缩短的等价物

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

你的公式需要更多的思考。

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

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

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

假设在来自 each 的列上与(并且不是双向的)MarketDim存在一对多关系,并且表如下:BondDimID

  BondDim          MarketDim

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

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

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

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

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

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

因此,结果(2)与 just 相同CALCULATE ( [PctMkt] )20%除非有过滤MarketDim要 exclude ID = 3

注意:如果对列或模型中过滤的任何表列进行操作,则此简化(2)不成立。即过滤器在关系中传播“下游”而不是“上游”。[PctMkt]BondDimBondDim


推荐阅读