SUMX(ALL...) 与 CALCULATE(SUMX.., ALL..) 有什么区别?

问题描述 投票:0回答:3

以下是2项措施:

SUMX ( ALL ( SALES ) , SALES[AMT] )

CALCULATE ( SUMX ( SALES, SALES[AMT] ), ALL (SALES) )

以下 2 项措施也类似:

SUMX ( FILTER ( SALES, SALES[QTY]>1 ), SALES[QTY] * SALES[AMT] )

CALCULATE ( SUMX ( SALES, SALES[QTY] * SALES[AMT] ),  FILTER ( SALES, SALES[QTY]>1 ) )

以上两个示例都清除 SALES 表上的自然过滤器并执行聚合。

我试图了解使用这两种方法在逻辑或性能方面的意义/用例是什么?

powerbi dax data-analysis powerbi-desktop measure
3个回答
3
投票

在 DAX 中,您可以通过不同的 DAX 查询/语法获得相同的结果。 因此,根据我的理解,DAX 提供了相同的结果:

SUMX ( ALL ( SALES ) , SALES[AMT] )

CALCULATE ( SUMX ( SALES, SALES[AMT] ), ALL (SALES) )

在所有情况/场景中,第一个是比第二个更简洁的实现方式。 目前,当我用 <100 records in a table ; the performance was the same for both the measures.

测试这些时

但理想情况下,第一种情况会比第二种情况更快,我们可以通过 DAX studio 通过 >100 万条记录进行测试。

您能分享一下您的想法吗?


2
投票

第一个使用表函数返回整个销售表,然后进行迭代。第二个在计算上下文中迭代销售表,这会删除销售表上存在的任何过滤器。

SUMX ( ALL ( SALES ) , SALES[AMT] )

CALCULATE ( SUMX ( SALES, SALES[AMT] ), ALL (SALES) )

在这两个 DAX 函数中,ALL() 正在做两件截然不同的事情,不幸的是使用了相同的名称。在第一个中,ALL() 用作表函数并返回一个表。在第二个中,ALL() 用于删除过滤器,可以用 REMOVEFILTERS() 替换(第一个不能以同样的方式替换)。

这是一个冗长而详细的主题,我建议您泡杯咖啡并在这里阅读:https://www.sqlbi.com/articles/managing-all-functions-in-dax-all-allselected- allnoblankrow-all except/

总结一下本文,ALL() 和 REMOVEFILTERS() 并不相同。在使用 REMOVEFILTERS() 的地方可以使用 ALL(),但反之则不然。

CALCULATE ( SUMX ( SALES, SALES[QTY] * SALES[AMT] ),  FILTER ( SALES, SALES[QTY]>1 ) )

此 DAX 使用计算来更改过滤器上下文并删除任何现有过滤器。重要的是它正在删除现有过滤器。

它们主要实现相同的结果(大多数时候),但仍然存在更多细微差别。在 DAX 中,总是有多种方法可以实现相同的结果。更重要的是,DAX 始终依赖于评估上下文。根据上下文,编写 SUM(SALES[AMT]) 可以返回不同的数字。如果它在带有颜色的表格中,它将返回每行每种颜色的总和以及总计。如果按国家/地区,它将返回按国家/地区的总计和总计。即,完全相同的公式根据上下文返回不同的结果。在这个简单的例子中,它们本质上是相同的。

第二个示例也永远不会以这种方式编写,因为您永远不应该过滤整个表(尤其是事实表)。您可以改为过滤该列。例如

SUMX(
FILTER(VALUES(Sales[Quantity]), 
Sales[Quantity]>1), Sales[Quantity] * Sales[SalesAmount]
)

整个视频非常精彩,但如果您从 45:33 开始观看,您可以看到关于删除过滤器和返回表格之间差异的很好解释,这是您问题的本质。您还需要了解视频前面解释的扩展表。 youtube.com/watch?v=teYwjHkCEm0&list=WL&index=2


0
投票

冒着陈述显而易见的风险,您将函数 (

SUMX
) 包装在由
CALCULATE
函数表示的进程中。

这是一个实际过程,它将尝试上下文转换

除了强制进行额外处理的性能影响之外,您问题的答案在很大程度上取决于这些措施如何以及在何处注入模型,因为它决定是否会发生上下文转换。

作为参考,这里只是一些相关的 SQLBI 文章:https://www.sqlbi.com/articles/introducing-calculate-in-dax/ https://www.sqlbi.com/articles/understanding-context-transition-in-dax/

© www.soinside.com 2019 - 2024. All rights reserved.