DAX 嵌套聚合 Contexts/Filters

DAX Nested Aggregate Contexts/Filters

我正在尝试编写一个 DAX 计算度量,它使用嵌套聚合来根据用户指定的查询上下文执行计算,但我无法弄清楚如何将查询上下文应用于内部聚合以及外部。我的表格数据的简化结构如下,其中每个销售记录代表一个用户以给定的销售价格向另一个用户销售单个小部件:

Schema

和一些示例数据:

Data

下面是计算的度量查询本身,它本质上是试图平均计算每个买家购买的商品的价格。它通过执行以下计算来做到这一点:

1) 内部 'Calculate':对于每个销售记录,计算给定卖家出售其小部件的平均价格(可能已过滤)。

2) 外部 'Calculate':对于每个销售记录,计算价格减去#1 中计算的金额的平均值,本质上给出实际销售额与预期销售额的差异。

Avg Actual/Expected Differential :=
    CALCULATE (
        AVERAGEX (
            Sale,
            Sale[Price]
                - CALCULATE ( AVERAGEX ( Sale, Sale[Price] ), ALLEXCEPT ( Sale, Sale[Seller] ) )
        )
    )

此公式适用于未应用查询过滤器但应用用户相关过滤器的标准情况。例如,Dale 的实际销售额与预期销售额是:

因此,平均 Actual/Expected 差异为 $.5 / 3 = $.17。

我 运行 遇到的问题是在 IsCashSale 字段上应用查询过滤器并将该过滤器应用于内部和外部 Calculate 函数。

例如,如果我想过滤内部和外部以仅包含具有 True IsCashSale 值的销售记录,我可以在 UI 和外部 Calculate 函数被适当地过滤,但是当内部 Calculate 运行时,它会在 IsCashSale 上删除此过滤器,因为 AllExcept 函数会从除 Seller 字段.

我尝试在 AllExcept 字段列表中包含 Sale[IsCashSale] 金额,但是由于当前行上下文,这仅包含具有与 IsCashSale 金额值相同的所有记录内部 'Calculate' 循环的当前记录。这会导致 IsCashSale 没有应用过滤器的场景不正确。

我想我可能正在寻找一种方法将选定的值从外部 Calculate 传递到内部?如果我能做到这一点,我可以将这些值作为过滤器包含在内部 Calculate 中。有没有办法使用 EarlierAllSelected 函数来做到这一点?还是有另一种方法可以做我想做的事情?谢谢!

如何使用 ISFILTERED 功能?

Avg Actual/Expected Differential 2:=IF(ISFILTERED([IsCashSale]),CALCULATE (
    AVERAGEX (
        Sale,
        Sale[Price]
            - CALCULATE ( AVERAGEX ( Sale, Sale[Price] ), ALLEXCEPT ( Sale, Sale[Seller],Sale[IsCashSak]))
    )
),
CALCULATE (
    AVERAGEX (
        Sale,
        Sale[Price]
            - CALCULATE ( AVERAGEX ( Sale, Sale[Price] ), ALLEXCEPT ( Sale, Sale[Seller]))
    )
)
)

现在,当 IsCashSale 列被过滤时,您将看到这样的结果,而当它未被过滤时,它将以原来的方式运行。

这些是你想要的结果吗?

+----+--------+-------+-----------+--------------+------------------------------------+
| Id | Seller | Buyer | IsCashSak | Sum of Price | Avg Actual/Expected Differential 2 |
+----+--------+-------+-----------+--------------+------------------------------------+
|  1 | Bob    | John  | TRUE      |            1 |                                  0 |
|  2 | John   | Bob   | TRUE      |            2 |                                 -1 |
|  3 | Dale   | Bob   | TRUE      |            1 |                               -0.5 |
|  8 | Sue    | Bob   | TRUE      |            3 |                                  0 |
| 10 | John   | Dale  | TRUE      |            4 |                                  1 |
| 13 | Dale   | Kelly | TRUE      |            2 |                                0.5 |
+----+--------+-------+-----------+--------------+------------------------------------+

好的,我想我找到了一个解决方案,但它有点复杂。它需要从每个卖家的平均销售额中分解出买家的个人购买总和。我相信最大的区别在于,通过使用 VALUES(Sale[Seller]) 集定义而不仅仅是 Sale,它允许我们在外部 CalculateIsCashSale 字段上保留任何过滤器。 ] 函数:

Avg Actual/Expected Differential:=CALCULATE(
(
    SUM(Sale[Price]) --Sum of Buyer purchases
    - CALCULATE (   
        SUMX( 
            VALUES(Sale[Seller]) --Calculate for each unique Seller
            ,CALCULATE(COUNTROWS(Sale)) --Need to multiply by number of purchases from this particular Seller
            * CALCULATE ( --Get Seller's average sale price
                AVERAGEX (Sale, Sale[Price])
                ,ALLEXCEPT(Sale, Sale[Seller], Sale[IsCashSale])
            )
        )
    )
)
/ COUNTROWS(Sale) --Divide by total number of sales to get average

)