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

时间:2016-11-16 16:13:01

标签: ssas dax

我尝试编写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的实际销售额与预期销售额为:

  • Larry以2美元的价格出售,其中Larry的平均销售额为3.5美元。差异= - $ 1.5
  • Bob以5美元的价格出售,Bob的平均销售额为3美元。差异= $ 2
  • John以4美元的价格出售,约翰的平均销售额为4美元。差异= $ 0

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

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

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

我尝试在AllExcept字段列表中包含IsCashSale金额,但由于当前行上下文,这仅包括与当前行数量值IsCashSale相同的所有记录记录内在&'39;计算'环。这会导致未对Calculate应用过滤器的情况不正确。

我相信我可能正在寻找一种方法将选定的值从外部Calculate传递到内部{?}}?如果我可以这样做,我可以将这些值包含在内部Earlier的过滤器中。有没有办法使用类似AllSelectedVector<SoapObject> vector = (Vector<SoapObject>) envelope.getResponse(); Log.d("Response in SOAP",vector.toString()); for (int i=0; i< vector.size();i++){ SoapObject object = (SoapObject) vector.get(i); if (object!=null){ Log.d("Vencimento", object.getProperty(0).toString()); Log.d("ValorAtualizado", object.getProperty(1).toString()); Log.d("Valor", object.getProperty(2).toString()); Log.d("Sequencia", object.getProperty(3).toString()); Log.d("NroBanco", object.getProperty(4).toString()); Log.d("BcoCobr", object.getProperty(5).toString()); Log.d("Cobranca", object.getProperty(6).toString()); Vector<Object> itens= (Vector<Object>) object.getProperty(7); for (int j=0; j<itens.size();j++){ SoapObject item =(SoapObject) itens.get(j); Log.d("Descricao", item.getProperty("Descricao").toString()); Log.d("ValorItem", item.getProperty("ValorItem").toString()); } } } 函数的方法来执行此操作?或者还有另一种方法可以做我想做的事情吗?谢谢!

2 个答案:

答案 0 :(得分: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 |
+----+--------+-------+-----------+--------------+------------------------------------+

答案 1 :(得分:0)

好的,我认为我找到了一个解决方案,但这有点令人费解。它要求买方从每个卖方的平均销售额中扣除个人购买的总和。我认为最大的区别在于,使用VALUES(Sale[Seller])设置定义而不仅仅是Sale,它允许我们在外部IsCashSale的{​​{1}}字段上保留任何过滤器。功能:

Calculate