首页 > 解决方案 > 为什么我的计算列中的 DAX 公式在一个实例中使用传播而不在另一个实例中进行过滤?

问题描述

假设我有几张桌子:

f交易

 Index   ProdID  RepID  Revenue
   1        1       1      10
   2        1       1      20
   3        2       2      30
   4        2       2      10

dSalesReps

RepID   RepName   CC1   CCC2   
1       joe       40    70
2       sue       30    70
3       bob             70

CC1 包含一个计算列:
CALCULATE(SUM(fTransactions[Revenue]))

我的理解是,它采用行上下文并更改为过滤上下文以将 fTransaction 表过滤到 RepID 并求和。根据关于该主题的sqlbi文章有意义:

“因为包含当前产品的过滤器上下文由于两个表之间的关系而自动传播到销售”

CC2 包含一个计算列,其中包含:
SUMX(fTransactions, CALCULATE(SUM(fTransactions[Revenue]))

但是,这一列在所有列中都放置了相同的值,并且似乎不像其他示例那样传播 RepID。相同的 sqlbi文章提到对整个 fTransactions 行进行了过滤。我的问题是为什么它在这里而不是另一个示例中这样做,以及 RepID 的传播发生了什么?

“CALCULATE 在表的所有列上放置一个过滤器以识别单行,而不是在其行号上”

标签: exceldaxpowerpivot

解决方案


在循环中创建计算列:power pivot 逐行计算结果。CALCULATE 将每一行转换为过滤上下文(上下文转换)。

但是,在第二个公式中,您有 2 个循环,而不是一个:首先,它循环 dSalesReps 表(因为这是您创建列的位置);其次,它循环 fTransactions 表,因为您使用的是 SUMX 函数,它是一个迭代器。

CALCULATE 函数仅在第二个循环中使用,强制 fTransactions 表中每一行的上下文转换。但是没有 CALCULATE 可以强制 dSalesReps 中的行进行上下文转换。因此,销售代表没有过滤。

解决问题很容易:只需将第二个公式包含在 CALCULATE 中。更好的是,删除第二个 CALCULATE - 这不是必需的,并且会使公式变慢:

CCC2 =
CALCULATE(
    SUMX(fTransactions, SUM(fTransactions[Revenue]))
)

这个公式与第一个公式基本相同(背景中的第一个公式转换为第二个,SUM 函数只是 SUMX 的语法糖)。


推荐阅读