首页 文章

DAX嵌套聚合上下文/过滤器

提问于
浏览
0

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

Schema

enter image description here

还有一些样本数据:

Data

enter image description here

计算出的度量查询本身在下面,其实质上是试图平均计算每个买方为他们的购买获得的讨价还价的好坏 . 它通过执行以下计算来完成此操作:

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

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

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

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

拉里以2美元的价格出售,拉里的平均销售额为3.5美元 . 差异= - 1.5美元

  • Bob以5美元的价格出售,Bob的平均销售额为3美元 . 差异= 2美元
    John以4美元的价格出售约翰,John的平均销售额为4美元 . 差异= $ 0

因此,平均实际/预期差异为$ .5 / 3 = $ .17 .

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

例如,如果我想过滤内部和外部只包含具有True IsCashSale 值的Sale记录,我可以在UI中创建适当的过滤器,并且外部 Calculate 函数被适当地过滤,但是当内部 Calculate 运行时,它会删除 IsCashSale 上的此过滤器是 AllExcept 函数的结果,该函数从 Seller 字段以外的所有列中删除过滤器 .

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

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

2 回答

  • 0

    如何使用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 |
    +----+--------+-------+-----------+--------------+------------------------------------+
    
  • 0

    好吧,我觉得我有点费解 . 它要求买方从每个卖方的平均销售额中扣除个人购买的总和 . 我认为最大的区别在于,通过使用 VALUES(Sale[Seller]) 集定义而不仅仅是 Sale ,它允许我们保留外部 Calculate 函数中 IsCashSale 字段上的任何过滤器:

    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
    

相关问题