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 的实际销售额与预期销售额是:
- Larry 的售价为 2 美元,而 Larry 的平均售价为 3.5 美元。差异 = -$1.5
- Bob 以 5 美元的价格出售,而 Bob 的平均销售额为 3 美元。差异 = $2
- 约翰以 4 美元的价格出售,约翰的平均销售额为 4 美元。差异 = $0
因此,平均 Actual/Expected 差异为 $.5 / 3 = $.17。
我 运行 遇到的问题是在 IsCashSale
字段上应用查询过滤器并将该过滤器应用于内部和外部 Calculate
函数。
例如,如果我想过滤内部和外部以仅包含具有 True IsCashSale
值的销售记录,我可以在 UI 和外部 Calculate
函数被适当地过滤,但是当内部 Calculate
运行时,它会在 IsCashSale
上删除此过滤器,因为 AllExcept
函数会从除 Seller
字段.
我尝试在 AllExcept
字段列表中包含 Sale[IsCashSale]
金额,但是由于当前行上下文,这仅包含具有与 IsCashSale
金额值相同的所有记录内部 'Calculate' 循环的当前记录。这会导致 IsCashSale
没有应用过滤器的场景不正确。
我想我可能正在寻找一种方法将选定的值从外部 Calculate
传递到内部?如果我能做到这一点,我可以将这些值作为过滤器包含在内部 Calculate
中。有没有办法使用 Earlier
或 AllSelected
函数来做到这一点?还是有另一种方法可以做我想做的事情?谢谢!
如何使用 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
,它允许我们在外部 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
)
我正在尝试编写一个 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 的实际销售额与预期销售额是:
- Larry 的售价为 2 美元,而 Larry 的平均售价为 3.5 美元。差异 = -$1.5
- Bob 以 5 美元的价格出售,而 Bob 的平均销售额为 3 美元。差异 = $2
- 约翰以 4 美元的价格出售,约翰的平均销售额为 4 美元。差异 = $0
因此,平均 Actual/Expected 差异为 $.5 / 3 = $.17。
我 运行 遇到的问题是在 IsCashSale
字段上应用查询过滤器并将该过滤器应用于内部和外部 Calculate
函数。
例如,如果我想过滤内部和外部以仅包含具有 True IsCashSale
值的销售记录,我可以在 UI 和外部 Calculate
函数被适当地过滤,但是当内部 Calculate
运行时,它会在 IsCashSale
上删除此过滤器,因为 AllExcept
函数会从除 Seller
字段.
我尝试在 AllExcept
字段列表中包含 Sale[IsCashSale]
金额,但是由于当前行上下文,这仅包含具有与 IsCashSale
金额值相同的所有记录内部 'Calculate' 循环的当前记录。这会导致 IsCashSale
没有应用过滤器的场景不正确。
我想我可能正在寻找一种方法将选定的值从外部 Calculate
传递到内部?如果我能做到这一点,我可以将这些值作为过滤器包含在内部 Calculate
中。有没有办法使用 Earlier
或 AllSelected
函数来做到这一点?还是有另一种方法可以做我想做的事情?谢谢!
如何使用 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
,它允许我们在外部 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
)