这里有必要总结一下calculate是如何工作。你可以使用下面的知识来检测下你对calculate的知识。如果你能理解下面的所有知识,那么你就已经在称为DAX大师的路上了。
calculate和calculatetable是DAX中唯二的能直接产生筛选上下文的函数。
calculate中,只有第一个计算表达式是必须的选项。其他参数(也就是我们所说的过滤条件参数)都是允许忽略不写的。如果这样的话,那么我们就可以只用到calculate上下文转换的功能。
calculate中的筛选参数有三种样式:
a.布尔条件 例如product[color]='white'
b.某列的值的列表,例如all(product[color]),或者复杂的filter条件 filter(all(product[color]),product[color]='white')
c.一个表的所有行,例如filter(all(product),product[color]='white')
用上面a.b两种写法,只能对一个列进行操作。使用c的写法,可以对任意数量的列进行操作。
所有的calculate过滤条件参数都是独立运算的。然后他们会用and的关系进行合并,最后使用新生成的筛选上下文条件,进行值的计算。
calculate中的过滤条件参数是在原始上下文的环境下计算,然后它们可以缩小,扩大或者改变计算。例如当使用布尔值的写法时候,calculate替换原有的筛选上下文,把筛选参数直接传递给数据源表格,而当参数使用filter过滤表格的时候,calculate把原始的上下文条件考虑进去。第一个参数,也就是计算表达式是在新生成的上下文环境中计算的。
calculate中上下文转换和筛选条件的执行有先后顺序,先执行上下文转换,再执行筛选条件。因此,筛选条件的参数回覆盖上下文转换生成的筛选条件。