在我们进一步去学习复杂的上下文时候,我们要通过一些案例,来检测你对上下文概念的掌握程度。下面的案例,不要立刻看答案,看到问题的时候,请停下来思考一下,然后再看看答案和你想的是否一样。
计算列中使用sum
首先来个简单的。如果在sales表中这样定义一个计算列,会发生什么?
Sales[SumOfSalesAmount] = SUM ( Sales[SalesAmount] )
因为这个是计算列。因此它会在每行中都计算,然后得到结果。这个结果会是什么样的。下面选项哪个是对的。
- 当前行的销售额,每行不一样。
- 所有行的销售总额,所有行一样。
-
一个错误,不能在计算列使用sum函数
停下来,思考下,然后看下下面的答案。
现在我们来看下DAX的计算过程都发生了什么:我们已经知道函数的计算目的,求销售总额。因为这个是计算列,DAX函数对每行都进行计算。每一行,它都计算函数表达式,然后处理整个表。函数在当前筛选上下文计算销售总额。所以,这个问题的背后实际就是:当前的上下文情况是什么?答案就是,所有的数据库行,因为DAX表达是在透视表或者其他筛选器之外。所以,没有没有任何筛选器,针对每一行,都会计算整个数据表。
即使当前行存在行上下文,但是sum函数忽略了它。而是使用筛选上下文,上面案例的情况下,是整个数据表。因此,第二个选项是正确的。每行的结果都一样,都是销售总额。
image.png
整个案例展示了两种上下文同时存在,它们使用不同的方式,共同决定了函数的结果。聚合函数例如sum,min,max,在计算列中只使用筛选上下文,而不使用行上下文。如果你是选择了第一个答案,绝大多数同学都也会这样选,也是很正常的情况。学习到目前为止,你还不能知道两种上下文是如何一起工作,如何一起决定计算结果。所以选择第一个很正常,但是现在你知道是错的了,也知道了为什么。
网友评论