Power BI-Power Pivot-客户最后下单时间(2)
上一篇主要是使用Power Pivot中的计算列,来了解2个事情:
其一:是行上下文什么时候才会被函数所应用;
其二:是使用行上下文筛选过滤数据的方式。
这一次我尝试使用度量值来实现同样的操作。度量值这个词看起来有点过于专业,很难一眼看出其具体意义。
通俗一点说,度量值是一个有固定名称的运算公式。度量值具有以下一些特性
其一:度量值脱离于表,这意味着度量值可以在任意的Power Pivot表中进行定义,同时,在度量值的公式中引用列时,必须显示指明表名;
其二:度量值自动启用行上下文,因而不需要强制调用Calculate函数,但是行上下文的筛选的表是通过关系关联的另一个表,还是需要调用该函数;
其三:度量值只有在实际被调用到时才会加载,而计算列是会随着表加载而一并进行运算,占用内存空间。
度量值跟Excel数据透视表拖入数值字段区域的字段配置类似,实际上透视表的计算字段是由Excel自动生成的度量值,透视表中自动建立的度量值有以下的局限性
1、这种度量值只能使用在当前透视表中使用。
2、只能针对一个当前拖入数据区域的字段进行计算,不能引用其他字段
3、计算可以使用的公式固定,无法自行扩展
这次的演示,我想在另一个非重复的客户信息表上来计算,而不是基于订单数据表进行运算,所以首先我需要得到一个非重复的客户名称列
在Excel2016跟Power BI Desktop中的Power Pivot有差异,不能通过新建表或者新建列的形式,所以我们需要借助于Power Query来生成这个非重复客户列,操作过程如下:
1、选中订单数据表,依次点击“数据/从表格”,将订单数据导入Power Query查询,并打开Power Query编辑器
2、选中客户列,依次点击“转换/转换到列表”,获得客户的列表信息
3、此时顶部的功能区会动态加载一个列表工具,找到并点击“删除重复项”,得到如下结果
4、依次点击“主页/关闭并上载至”,在弹出的加载对话框中,选中表,现有表,找一个订单数据表右侧某个单元格,并勾选“将此数据添加到数据模型”。
5、依次点击“Power Pivot/管理”,不要点击“添加到数据模型”按钮,因为在上一步中我们已经将其添加到模型了
接下来我们来创建度量值,Excel中的Power Pivot的度量值是在计算区域中建立的。
在建立度量值之前,我们需要首先在订单数据表和客户表之间建立关系,关系非常简单,我们切换到关系视图后,建立关系,如下图
然后我们重新切换到数据视图
1、我们选择任意一个表中的任意一个单元格,例如“客户”表中的第一个格子;
2、点击功能区下的公式编辑栏,输入公式
客户最后订单日期:=CALCULATE(MAX('订单数据'[订单日期]),ALLEXCEPT('订单数据','订单数据'[客户]))
说明几点:
其一:度量值需要以度量值名称开头,而计算列不需要
其二:Excel中定义度量值是使用 :=,而Power BI Desktop中是直接使用=
其三:度量值中引用列时,必须所有的列都要指定表名,而计算列中,如果引用当前表的列,可以省略表名
从上面公式的内容可以看到,度量值的公式和计算列的公式是差不多是一样的,除了计算列在引用本表的字段时,可以省略掉表名之外。
接下来我们来看看度量值在应用到不同表时的结果有何异同
1、首先,我们在订单数据表和客户表中各添加一个计算列,公式相同
=[客户最后订单日期]
结果分析1
结果判定:客户表的计算结果是错误的,订单数据计算结果是正确的;这是为何了?
分析:因为在ALLEXCEPT函数中,我们保留上下文筛选的列是订单数据表中的客户而不是基于客户表的客户,我们将度量值的公式更改为如下形式:
客户最后订单日期:=CALCULATE(MAX('订单数据'[订单日期]),ALLEXCEPT('客户','客户'[客户]))
结果分析2:
结果判定:此时客户表中的计算结果正确了,但是订单数据表中的计算是错误的
小结:
在度量值中使用筛选过滤时,请确保与所运算对应的表保持一致(在A表中运算,其筛选的列应该为A表中的列)