Warm tip: This article is reproduced from serverfault.com, please click

excel-DAX筛选器上下文

(excel - DAX Filter context)

发布于 2020-11-28 22:13:58

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

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

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

Questioner
Wadstk
Viewed
0
Alexis Olson 2020-11-30 11:44:45

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

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

是缩短的等价物

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

你的公式需要更多考虑。

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

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

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

假定MarketDim每个列上的具有一对多关系BondDim(并且不是双向的),ID并且这些表如下所示:

  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以排除,否则其结果将是just ID = 3

注意:(2)如果[PctMkt]模型中BondDim按筛选的列或任何表列进行操作,此简化不适用BondDim即,筛选器跨关系传播“下游”,但不传播“上游”。