【问题标题】:DAX Nested Aggregate Contexts/FiltersDAX 嵌套聚合上下文/过滤器
【发布时间】:2016-11-19 04:53:38
【问题描述】:

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

Schema

还有一些示例数据:

Data

计算出的度量查询本身如下所示,它实质上是在尝试平均计算每个买家在购买时获得的便宜货。它通过执行以下计算来做到这一点:

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

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

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

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

  • Larry 的售价为 2 美元,而 Larry 的平均售价为 3.5 美元。差价 = -$1.5
  • Bob 的售价为 5 美元,而 Bob 的平均售价为 3 美元。差价 = 2 美元
  • John 的售价为 4 美元,而 John 的平均售价为 4 美元。差价 = $0

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

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

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

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

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

【问题讨论】:

  • 注意:我一直在搞乱KeepFilters 函数,这似乎让我非常接近:Avg Actual/Expected Differential:=CALCULATE ( AVERAGEX ( Sale, Sale[Price] - CALCULATE ( AVERAGEX ( Sale, Sale[Price]), ALLEXCEPT(Sale, Sale[Seller]), KEEPFILTERS(VALUES(Sale[IsCashSale])) ) ) ) 在这种情况下,我应用IsCashSale 过滤器时的值是正确的,并且在未应用过滤器时,5 个值中有 3 个是正确的。
  • 它仍然不是 100% 正确,但它可能是一个开始。有人可以解释那里发生了什么吗?
  • 没关系,似乎删除 KeepFilters 函数但保留 Values 调用结果相同。 KeepFilters 没什么特别的

标签: ssas dax


【解决方案1】:

使用 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 |
+----+--------+-------+-----------+--------------+------------------------------------+

【讨论】:

  • 是的,可以,但是可以将If 逻辑放在内部计算的过滤器列表中吗?否则,编写表达式以覆盖可能存在多个过滤维度的架构会变得非常庞大。
  • 你说得对,我也不喜欢长公式,所以我犹豫要不要分享这个答案。
  • 我刚想到这个,一开始不使用嵌套 CALCULATES 怎么样?如何分离 CALCULATE 函数,然后将 [IsCashSale] 放入第二次计算的 ALLEXCEPT 中?此公式给出相同的结果:平均实际/预期差异 3:=CALCULATE (AVERAGEX (Sale, Sale[Price])) - CALCULATE (AVERAGEX (Sale, Sale[Price]), ALLEXCEPT (Sale, Sale[Seller],Sale [IsCashSale]) )
  • Avg Actual/Expected Differential 3:=CALCULATE ( AVERAGEX ( Sale, Sale[Price] ) ) - CALCULATE ( AVERAGEX ( Sale, Sale[Price] ), ALLEXCEPT ( Sale, Sale[Seller],Sale[IsCashSak]) )
  • 我喜欢以这种方式简化它的想法,但我认为这不适用于您仅按买方过滤的情况(例如,计算所有购买的所有差异的平均值由买方对所有卖方),这是我真正感兴趣的。您提供的第一个公式将正确处理这种情况。
【解决方案2】:

好的,我想我已经找到了解决方案,但它有点令人费解。它需要从每个卖家的平均销售额中分解出买家个人购买的总和。我相信最大的区别在于,通过使用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

)

【讨论】:

    猜你喜欢
    • 2020-07-26
    • 2018-01-30
    • 2014-12-31
    • 2021-04-19
    • 2014-11-14
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多