温故而知新
附加这个小章节有2个目的:
1.温故而知新。之前曾提到过什么是上下文,现在完成了筛选和聚合函数的学习,正好利用这个机会结合实践巩固一下对这个概念的认知。
2.Calculate是DAX中最有力量的函数,它可能无处不在,我来带你识别隐藏的Calculate。
什么是上下文?对于一个非IT出身的学生,初次见到上下文这个词着实让我困惑,特别让我想起了学生时代的阅读理解。理解字里行间的逻辑,提炼中心思想。
其实道理是一样的,现在我们面对的表格就好比阅读理解的语段,只有理解好它们的逻辑,才能写出正确的表达式。表的构成很简单,列和行。所以它的上下文分为两种,筛选上下文(即列的上下文)和行上下文。
筛选上下文最容易理解,是纵向的列筛选条件。比如下面的表中销售量2974的筛选上下文是"2016年-第2季度-拿铁",即对日期列和咖啡种类列的筛选。
行上下文,顾名思义,是要横向的看。最简单粗暴也是最好用的理解方法就是视行上下文=当前行。比如下图中的第一行,[利润]列的计算是在行上下文中完成的,即当前所在行,价格=24,成本=9.6,所以价格-成本=14.4。
为了更好地理解行上下文,我们换一张表再来做个试验。在原材料表中新建列[咖啡数量] = sum('咖啡数据'[数量]),结果是每一行都是同一个结果54245。这是为什么呢?
以第一行卡布奇诺行为例,在计算咖啡数量时,行上下文是原材料表中的当前行,而计算的公式sum('咖啡数据'[数量])是求数据表中的[数量]列的和。两者在不同的表中,所以原材料表的行上下文对数据表的计算并没有影响,输出的结果为咖啡数据表中数量列的总计。
你可能会问,不对啊,记得我们的数据模型关系原材料表与数据表间是以[咖啡种类]建立的一对多关系,为什么没有求得卡布奇诺的数量呢?
关键的语法就在这里了,行上下文不会自动转换成筛选上下文,如果需要转换,要使用Calculate。请记住这条规则。我们试一下把公式外套一个Calculate。[咖啡数量] = Calculate(sum('咖啡数据'[数量])),求得结果:
这是个什么逻辑?我们还以第一行举例,Calculate这个超级力量函数就好比模型的启动键,当赋予Calculate时,关系模型的阀门启动,数据信号顺流而下,这个数据信号是将行上下文转换成了筛选上下文,按照当前行中咖啡种类卡布奇诺这个筛选条件对数据表进行筛选,于是这次我们得到了所有卡布奇诺的数量求和4239。
再来看个例子,在学习Filter时我们建立的一个度量值销售量7,如果把[销售量]度量值替换成Sum,Sum的外面披上一个Calculate外套,得到的结果将与销售量7完全一样。
外套Calculate的作用是把Filter中的行上下文(当前行)转换成了以城市为筛选条件的筛选上下文,完成数量>200的测试,再以完成测试后返回的虚拟表来确定最终的筛选上下文。
为什么度量值[销售量]没有外套Calculate却能达到同样的上下文转换效果?这个答案是度量值自带天然的Calculate,我们把这个Calculate叫做隐藏的Calculate。所以当你下次看到[销售量]=sum('咖啡数据'[数量])时,有意识地知道它其实是Calculate(sum('咖啡数据'[数量]))。