ALL函数包括ALL(), ALLEXCEPT()和ALLSELECTED。它们非常实用,可以提供灵活的动态计算。但是DAX的弊病是不够直观,有时候不好理解什么时候和哪里应该用ALL函数。这篇文章用一个简单的例子来介绍一下。

开始之前,先建立一个简单的表格:

和一个简单的度量值:

Simple Total = SUM('Table'[Value])

然后生成一个表格图像:

1. ALL()

现在来建立一个新的度量值:

ALL Total = CALCULATE(SUM('Table'[Value]), ALL())

把它放进去表格图像:

可以看到“ALL Total”忽略了Cat 1的限制,直接把所有Value值加总。

这次我们来建立另一个度量值:

ALL CAT 1 = CALCULATE(SUM('Table'[Value]), ALL('Table'[Cat 1]))

结果跟"ALL Total“一样。我们把Cat 1替换成Cat 2试试:

”All Total“的结果不变。但是"ALL CAT 1”变了且受Cat 2的筛选限制。因为这个度量值只忽略对Cat 1 的限制。

2. ALLEXCEPT()

我们建立一个新的度量值:

ALLEXCEPT CAT 1 Total =
CALCULATE(
SUM('Table'[Value]),
ALLEXCEPT('Table', 'Table'[Cat 1])
)

它忽略了Cat 2的筛选限制,我们把Cat 2替换回Cat 1看看:

可以看到这个度量值受Cat 1限制。因为ALLEXCEPT()解除筛选限制 除了 函数里面指定的列。

3. ALLSELECTED()

同样地,建立一个度量值:

ALLSELECTED Total =
CALCULATE(
SUM('Table'[Value]),
ALLSELECTED('Table')
)

看起来结果跟“ALL Total”一样。这次我们加一个Cat 2的筛选器:

然后筛选“Y”看看:

一如既往地,"ALL Total“保持21。"ALLSELECTED Total"却变成了6 (所有Y的值 1+2+3=6)。这是因为,ALLSELECTED()把忽略筛选限制应用到它指定的表格/列,而外部筛选器视为指定之外的范围。

不妨把ALLSELECTED()只运用一列:

ALLSELECTED Cat 1 Total =
CALCULATE(
SUM('Table'[Value]),
ALLSELECTED('Table'[Cat 1])
)

这个应该更好理解,它只指定忽略Cat 1的限制,所以仍受到Cat 2的筛选影响。

一个简单的例子说明,希望对你有帮助。

谢谢阅读。

Logo

永洪科技,致力于打造全球领先的数据技术厂商,具备从数据应用方案咨询、BI、AIGC智能分析、数字孪生、数据资产、数据治理、数据实施的端到端大数据价值服务能力。

更多推荐