Power BI-Power Pivot-客户最后下单时间(1)
今天在Power BI星球中看了一篇有关计算列和度量值差异的案例文章,其操作是在Power BI Desktop中完成的,我这里将该案例转换为Excel2016中的实现方式,案例中的数据类似如下图所示。
我们的目的就是算出每个客户的最后的订单日期值,这个需求非常简单,即使使用Excel公式都很容易实现,但是这个案例主要的目的是用最简单的方式来理解计算列和度量值。
首先我们来看看Power Pivot中的计算列
1、在空白的Excel工作表中录入如上图所示的数据内容后,将其转换为“表”并重新设置名称
2、在Power Pivot选项卡中,找到“添加到数据模型”按钮,打开Power Pivot界面如下
3、我们首先使用“添加列”的方式,尝试一次,按照逻辑,每个客户的最后的订单日期,就是求每个客户订单日期的最大值,我们首先使用公式
=MAX([订单日期])
说明几点:
此处使用的是计算列,并且引用的是本表中的列,所以不需要标注出表名称
字段名称使用成对的中括号隔离,表名称使用成对的单引号隔离
结果分析1
观察图片所得到的的结果,可以看出采用类似Excel写公式的逻辑,返回的结果是错误的,该计算列中所有行返回的是同一个值,即订单日期列的最大日期值。
我们需要计算列在每一行中针对该行自己的情况(上下文)来计算,此时需要使用Calculate函数,那么我们就来看看套用了Calculate后的结果
结果分析2
观察图片所得到的的结果,套用Calculate函数后,使每一行在计算的时候都考虑了当前行的情况,也就是使用了当前行的数据。更准确的说是使用当前行的所有列的值筛选了整个表的所有行。
即:例如第一行,筛选条件为:订单日期为2019/1/1,客户名称为甲,产品名称为A,金额为100的所有行。
筛选完毕后,再在该筛选结果表上计算订单日期的最大值。
我们在Excel中新添加一行数据,与第1行数据一模一样,将计算的逻辑切换为计算金额合计,修改公式来观察结果,其计算的结果为200
基于以上情况的分析,如果我们需要按客户来计算订单日期的最大值,那么就需要清除对订单日期、产品名称、金额列的筛选条件,此时我们就需要借助于AllExcept函数
=CALCULATE(MAX([订单日期]),ALLEXCEPT('订单数据','订单数据'[客户]))
ALLEXCEPT函数有2个参数:
第一个参数:进行筛选排除的表名
第二个参数:将只对该参数中指定的列实施筛选,其它的列将清除筛选
启示总结:
在调用CALCULATE函数才会启动按行筛选功能,否则函数的计算将没有任何筛选数据能力,最终的计算将针对整个表计算
在没有配置行筛选的范围时,对于每一行,将会使用所有的列的值对表数据行进行筛选
要控制筛选条件,需要使用筛选过滤的函数进行处理,例如ALLEXCEPT