calculatetable的工作方式和calculate相同。区别在于它们返回的结果。calculate返回一个值,而calculatetable计算一个表表达式,返回一个表。下面这函数就是我们想要的。它移除了brand和color,但是保留了其他的filter条件。
[CalcTable Version] :=
CALCULATE (
SUM ( Sales[SalesAmount] ),
FILTER (
CALCULATETABLE (
Product,
ALL ( Product[Brand] ),
ALL ( Product[Color] )
),
AND (
Product[Brand] = "Tailspin Toys",
Product[Color] = "Black"
)))
如下图:最后一个函数calctable版本的计算结果和calculate 版本的一致。
image.png这里讨论的使用两种写法,布尔值和filter,来写等效的计算表达式,对你需要处理复杂条件的时候,非常重要,例如,如果你要表达一个or的条件而不是and,那么你就需要知道这个知识。
例如:如果你要计算所有brands和colors的产品,brand等于Tailspin Toys或者color是Black的产品,然后你要使用calculatetable定义函数,下面是代码
[CalcTable Version OR] :=
CALCULATE (
SUM ( Sales[SalesAmount] ),
FILTER (
CALCULATETABLE (
Product,
ALL ( Product[Brand] ),
ALL ( Product[Color] )
),
OR (
Product[Brand] = "Tailspin Toys",
Product[Color] = "Black"
)))
实际上,使用Calculatetable是清除brand和color,并且保持其他筛选器不变的一种好方法。因此,多列使用and的时候,很简单的只使用calculate解决,因为calculate自动把多个条件用and集合起来,而另一方面,or连接多个列,就复杂多了。因为你不能依赖默认为and的calculate,你需要手工的写复杂的DAX函数。
另外,作为备选函数,你也可以使用下面的代码,用all函数带两个列的参数:
[ALL Version OR] :=
CALCULATE (
SUM ( Sales[SalesAmount] ),
FILTER (
ALL ( Product[Brand], Product[Color] ),
OR (
Product[Brand] = "Tailspin Toys",
Product[Color] = "Black"
)))
这种写法看起来优雅多了,但是对于初学者,这个看起来不那么直观。
这节中,我们看到只要使用了多个列的条件,就会使结果变得难以理解。即使是有经验的DAX使用者,往往都难以完全把握上下文评估的路径。因此,不要被这章节的复杂吓到,只有不断的累积经验,才能使你做到快速准确的理解函数的计算。
网友评论