浅析ALL
、ALLEXCEPT
和ALLSELECTED
ALL函数
原理:
ALL
函数在DAX中用于创建一个新的上下文,这个新的上下文不包括任何之前应用到表或列上的筛选器。换句话说,它“重置”了筛选上下文,使得所有的行或列都可见,仿佛没有任何筛选器被应用过。这允许你执行基于整个数据集(而不是仅基于当前筛选结果)的计算。
使用场景:
- 当需要计算一个不依赖于任何当前筛选条件的汇总值时,如总销售额、总库存量等。
- 在创建一些自定义计算列或度量时,可能需要使用整个数据集作为参考,而不是仅基于当前筛选的结果。
例子:
假设你有一个销售表Sales
,其中包含了SalesAmount
(销售额)和Region
(地区)两列。你想要计算所有地区的总销售额,而不受任何地区筛选器的影响。你可以使用以下DAX公式:
Total Sales = SUM(ALL(Sales[SalesAmount]))
这个公式会返回Sales
表中所有行的SalesAmount
列的总和,不受任何地区筛选器的影响。
ALLEXCEPT函数
原理:
ALLEXCEPT
函数与ALL
函数类似,但它允许你指定一些列,这些列上的筛选器将不会被清除。换句话说,ALLEXCEPT
会创建一个新的上下文,其中除了指定的列之外的所有筛选器都被清除了。这允许你在保持某些筛选条件的同时,忽略其他筛选条件。
使用场景:
- 当你想基于某些特定的列(如分类或属性)进行计算,但同时又希望忽略其他列的筛选条件时。
- 在进行跨多个维度(如地区、产品类别等)的分析时,你可能希望基于某个维度进行计算,但保持其他维度的筛选条件不变。
例子:
继续上面的例子,假设你想要计算每个地区合格产品的总销售额,但不想受其他筛选条件(如日期范围)的影响。你可以使用以下DAX公式:
Qualified Sales by Region =
SUMX(
VALUES(Sales[Region]),
SUM(ALLEXCEPT(Sales, Sales[Region], Sales[IsQualified]), Sales[SalesAmount])
)
这个公式首先使用VALUES(Sales[Region])
为每个地区创建一个上下文,然后使用ALLEXCEPT
函数清除除了Region
和IsQualified
列之外的所有筛选器。最后,它计算每个地区合格产品的总销售额。
ALLSELECTED函数
原理:
ALLSELECTED
函数用于创建一个新的上下文,其中只包含当前筛选上下文中的可见值。它不会清除任何筛选器,而是会考虑所有当前已应用的筛选器(包括切片器、过滤器等)。但是,它会忽略那些不在当前筛选上下文中的列或值。这允许你基于当前可见的数据集进行计算。
使用场景:
- 当你想基于当前筛选上下文中的可见值进行计算,但不想考虑那些不在当前筛选上下文中的列或值时。
- 在使用切片器或过滤器筛选数据后,你可能想要基于这些筛选条件进行计算,但同时又不想考虑其他不在当前筛选上下文中的列或值。
例子:
假设你有一个报表,其中包含一个按ProductCategory
筛选的切片器。你想要计算当前筛选的产品类别下的总销售额,但还想确保其他可能应用的筛选器(如日期范围)被考虑在内。你可以使用以下DAX公式:
Filtered Total Sales = SUM(ALLSELECTED(Sales[SalesAmount]))
这个公式会返回当前筛选上下文(包括切片器和过滤器)中所有可见行的SalesAmount
列的总和。它考虑了所有已应用的筛选器,但只针对SalesAmount
列进行计算。