最强大的函数 Calculate
从Calculate的语法结构我们可以看出它能够把计算表达式和筛选条件整合起来。我们前面把度量值比作带着漏斗的计算器,那么Calculate就是漏斗与计算器之间的启动键,它能够赋予漏斗按指定的条件来执行过滤筛选,同时让计算器执行运算。
我们按上面制作一个矩阵表,行为'原材料'[咖啡种类],列为'杯型'[体积],值为[销售量]。
现在我们再做一个试验,再创建一个[销售量2]=Calculate([销售量], '原材料'[咖啡种类]="拿铁", '杯型'[体积]="480ml"),把矩阵表中的值替换为[销售量2]。你会得到下面这个表,是不是有些惊讶!难道是出Bug了?所有的值都为在拿铁咖啡和杯型体积=480ml限定条件下的销售量。
这个输出的结果是完全没有问题的,我们做这个例子是为了说明Calculate工作原理,从这个结果中可以得出Calculate函数的一个重要结论:
Calculate可对初始筛选增删改,即生成新的筛选上下文。
可以说掌握了Calculate就好比掌握了自定义功能,比方说标准的拿铁咖啡是由浓缩、牛奶、奶泡按一定比例构成,现在你可以自定义修改配方,加入香草和焦糖变成香草焦糖拿铁。
Calculate可以应用在多个表。注意到[销售量2]公式引用的是'原材料'表和'杯型'表,两个都是Lookup表。启动Calculate仿佛是开启了漏斗过滤器的一个阀门,使数据像水一样顺流而下,执行对数据表的筛选。
筛选条件拿铁和体积=480ml两者同时满足,是AND关系。在DAX中,如果想表达或的关系,运算符为“ || ”。但是在本例中如果直接写=Calculate([销售量],'原材料'[咖啡种类]="拿铁"||'杯型'[体积]="480ml") 这个是无效的。记住在Calculate中使用||时,必须是引用同一列,比如=Calculate([销售量],'杯型'[体积]="360ml"||'杯型'[体积]="480ml")这个是可以的。
有人称Calculate为超级版Sumif,但它的能力远比Excel中的Sumif强大多了。我们这个例子用的销售量是Sum求和,然而Calculate可以与各种聚合函数搭配组合Average, Count, Max...可以说是没有限制。要知道Excel中是没有Maxif/Minif这种公式的。
Calculate的强大还不止于此,它可以与各种筛选器函数搭配组合如All,Values,Filter来发挥更强大的功能,后面的几节我们分别介绍。