在Power BI中切换到“关系视图”。图3.3.1所示的是一张很有科技感的数据模型关系视图。记得之前加载数据的时候用了两分钟吗?Power BI没有偷懒,而是智能地将各表中相关的字段进行关联。这两分钟的工作相当于手动几个小时的工作。
读者可以利用左下角的视图缩放功能,自己摆弄一下表格的位置,看看能不能把所有的表格都拖曳到视图里并且码放得更有条理一些?笔者习惯把维度表放置在视图的上方,将事实表放在视图的下方。关系条理性清晰的视图,更方便用户理解模型的构造。
图3.3.1
请留意表格之间的符号标志:“1”“*”和箭头。为了方便读者理解,在此用水流比喻表格之间的关系:水从高处向低处流动,由小溪汇成江河。上方的表通常被称为1表,象征小溪,下方的表通常被称为多表,象征江河。人们知道小溪的水流向江河,却不知道江河里的水来自哪条小溪,如图3.3.2所示。
图3.3.2
箭头表示水流从1表流向多表,象征通过1表查询多表的数据。比如通过日期表(1表)查询销售事实表(多表)中每月的销售情况。而在默认情况下,多表不可以反向查询1表的内容,除非将“交叉筛选器方向”设置为双向。
然而,1表与多表的关系是相对的,一张表可以是上方表的多表,同时也可以是下方表的1表,属于之前介绍的雪花模式。无论有多少张表关联,最重要的是能清晰分辨水的“流向”,如果中途有逆流,其上方的表则无法查询下方的表的内容。后文会通过实例演示让读者更形象地理解。
在日期表与其他事实表的联接中,有实线联接,也有虚线联接。在线下销售表(事实表)与日期表之间存在3条关系链,分别为OrderDateKey(订货日期键)、DueDatekey(到期日期键)和ShipdateKey(发货日期键),其中DueDatekey为实线联接,其余为虚线联接。在此可以将实线联接比喻为开了水闸的河道,溪水从此流过。可以将虚线联接比喻为关了闸的河道,水流无法通过。
单击界面中的实线,弹出的“编辑关系”对话框中会显示两张表彼此的联接关系,勾选“使此关系可用”复选项代表这个关系为“激活”状态,用实线表示。虚线则表示“非激活”状态,在默认情况下,1表会通过实线关系查询多表。除此之外,基数属性定义两张表的关系,比如这里的多对一定义了经销商表和日期表之间的关系,“交叉筛选器方向”定义查询的方向,默认值为“单一”,指1表可筛选查询多表的值或者简单理解为1表控制多表。当将此选项值改为“两个”的时候,筛选逻辑变成双向,通常用于多表对多表的查询关系,如图3.3.3所示。此特殊选项只存在于Power BI中,Excel只能支持1表对多表的查询,除非使用DAX函数,才能实现双向筛选。
图3.3.3
注意: 表间多对多关系是很特殊的一种逻辑关系,微软也仅仅在2018年8月更新的版本中允许建立这种关联。但在使用时仍然需要谨慎,要反复验证其结果是否导致计算错误。在一般情况下,建议用户优先考虑建立1表对多表关系来回避多表对多表关系的复杂性。
在Power BI数据模型中,两个表格间可以有一条以上的联接,但最多只有一条联接为实线联接,其余皆为虚线联接。当报表查询需要使用虚线联接时,可以使用DAX 函数里的USERELATIONSHIP函数实现,这里将其比喻为管控水闸的系统。在通常情况下,使用频率高的关系应作为默认关系,其关系为“激活”状态。
因为订货日期是商务报表中最常用的字段,此处则取消对“DueDatekey”的勾选,并找到关联“OrderDateKey”的虚线,勾选“使此关系可用”复选框,此时“OrderDateKey”为“激活”状态,如图3.3.4所示。我们在线上销售表和线下销售表中分别改动此关系,这对后面的操作非常重要。
图3.3.4
虽然Power BI具有数据表自动关联的功能,但是这不代表设计者可以完全依赖自动关联功能而不了解表之间的关系。设计者应该清楚表之间的关系。在真正开始建立关系前,先在脑海里回答“5W1H”的问题,再在草图上勾勒表间的关系,最后才在模型中建立关系,如图3.3.5所示。
图3.3.5
如果希望进一步了解如何建立表间关系,则建议读者移除表间的关系,然后重新建立关系。操作方法如下所示。
(1)先保存一个备份文件,在备份文件里选中表间关系,按Delete键或用鼠标右击,在弹出的右键菜单中选择相应的命令删除关系。
(2)找到两表间要关联的字段,然后选中其中一方(例如线上销售表里的“DueDatekey”),按住鼠标左键不放,并拖曳至另外一方(日期表里的“DateKey”),松开鼠标左键,关系建立完成。必要时再参照原文件的关系。
注意: 在真实环境中,有时1表内有重复值,会导致在联接时报错。此时需要检查1表的值是否出现重复值,比如,在下载时确保维度表里的值是非重复的。否则维度表就不是1表(1表中的“1”代表没有重复值)。不可以与事实表建立正常的一对多关系,如图3.3.6所示。
图 3.3.6
部分读者会问为何两表间无法同时出现两条及两条以上的实线联接?因为如果有多于一条实线联接,那么DAX会不知道采用哪个联接来理解维度表与事实表的逻辑关系。例如,假设线下销售表的销售日期、发货日期与日期表间皆为实线联接,当以日期表中的日期为基准时,DAX会不知道销售金额是按销售日期展示的还是按发货日期展示的。
再来比较Excel的关联设定,打开Excel版数据库的关联界面,稍微调整主要表的位置,可以明显看出一些SQL中有的关联在此处不存在,例如日期表没有关联,如图3.3.7所示。
因此,需要手动完成一些关联,参照上文关联的操作,将两张表的相关字段关联即可,表3.3.1中列出了需要添加的几个关键关联。
图 3.3.7
表3.3.1
如果出现了以下联接错误,则说明表中有空值(null),空值的产生可能是由于使用Excel格式数据表导致的,如图3.3.8所示。
图3.3.8
Power BI不允许联接空值,应当删除产品表中的空值,再尝试联接。
(1)单击菜单栏中的“编辑查询”命令。
(2)选中右侧的DimProduct(产品表)。
(3)单击“ProductKey”列或者任意一列,取消勾选“null”复选框,如图3.3.9所示。
单击菜单栏中的“关闭并应用”命令。
图3.3.9
此外,Excel版数据库中的员工表与线下销售表的关系不正确,应该改为SQL表中的关系,如图3.3.10所示。这里要提醒读者,在真实环境中,用户应该对数据关系有正确的理解,而不可完全依赖自动关联功能。
如果源文件指向不同路径,那么用户可以通过菜单中的“数据源设置”命令进行修改,如图3.3.11和图3.3.12所示。
图 3.3.10
图 3.3.11
图 3.3.12