Power BI之DAX神功:第4卷第1回 使用计算列创建物理关系
这一卷大家放轻松,没有太多用脑过度的知识,主要讲解DAX高级关系,但是在实际应用中,我们普遍是化繁为简的,表格数量也是越少越好的,有些人会说为了更多颗粒度,我需要使用很多表格。那你想一想,你分析不出结果或是结果错了,颗粒度还是最重要的吗?这就好比我们玩FPS游戏时,为了捡一把好的装备,结果被暴头了,这种情况还不如拿个普遍装备站到最后的。不是不可以有“高要求”,但是要先有能力,再说要求。
一、主键和外键不一样,怎么建立关系

我们在SQL中的处理方法:截取表1学号列,从第2个字符开始截取到最后一个字符。然后再与表2的学号列建立关系。SQL语句如下(Access下测试)
查询结果:

那么在DAX中用计算列怎么处理呢?

Ps:这是教学目的讲述在主键与外键不同的情况下如何处理,暂时使用1对1关系举例,1对多也是同理。

当然方法不只一种,你也可以对表2增加字母A,再与表1的学号列建立关系。

特别注意:如果使用mid函数,它与Excel工作表函数、VBA、SQL等都不一样,DAX中的mid函数要求输全3个参数,mid(字符串,从哪里开始,截取几个)
防抬扛:如果主键和外键不是这样的,例如主键abc,外键123;既然这两张表你认为他有联系,想必主键与外键你的企业曾经修改过,或者有自己的一套对应方案。你可以使用VBA的字典或者PowerQuery先进行数据清洗后再使用DAX建模。
二、双主键(复合主键)问题
权威指南上提供了一个例子,但是它的表和数据都太多了,其实目的很简单
我大致用自己的理解说一下:

先说业务:以销售表第一行为例,一店商品A01,实际销售金额1元,如果不打折我的正常售价应该是多少钱?1 / 0.7 = 1.43元 其它行都以此类推
你不能使用日期连线,也不能使用商品编码连线,在数据库中,我们可以直接建立多条关系

SQL代码:

那么在DAX中如何使用新建列搞定:


权威指南上并没有向我这样去做,而是使用COMBINEVALUES函数,函数作用:将多个文本字符串联接成一个文本字符串。支持 DirectQuery 模型中的多列关系。
语法:COMBINEVALUES(分割符,第1列,第2列,........第N列)
返回结果:

Import和DirectQuery主要有以下区别:
Import:被选中的表单和列会被以复制的形式导入到PowerBI里。当你创建或者使用可视化时,PowerBI使用的是导入本地的数据。如果源数据发生变化,你必须通过刷新方式相当于将所有的数据重新导入一次才能在Power BI中看的更新。
DirectQuery:源数据不会被导入或者复制到Power BI里。相关数据源的表单和列会出现在Power BI的字段中。当你创建或者使用可视化时,PowerBI会直接从数据源中查找数据,这就相当于你的数据永远是最新的。
跟我学过Access的小伙伴,Import就类似导入表,DirectQuery方式就类似链接表。
Excel文件我们使用导入表就可以了,你可以想一想,如果你连接的MySQL服务器,SQL Server服务器,他可能把服务器上的内容复制到你的电脑上吗?先别管速度问题,你硬盘也存不下呀。这时采用的就是链接表形式。
所以在我们导入Excel表格的情况下,以上两种新建列方式在速度上并无区别。
三、如果只是想从另一张表中获取列内容,建议LOOKUPVALUE
《DAX神功》第1卷第6回 我提到了Lookupvalue表之间可以不建立关系(但是你来PowerBI并不是只添列加着玩来,迟早都要建立关系的)
我们现在提供的只是一个教学案例,你实际工作表,这两个表肯定有N多列,如果你只是想V过来很少的列,那么选择Lookupvalue也是不错的选择。
语法:Lookupvalue(把哪张表的哪个列拿过来, 找那张表上的谁, 找自己表里的谁.....)
当日期和商品编码都满足条件时,我们将折扣V过来:
返回结果:

《孙兴华讲PowerBI火力全开》PowerBI必学课程
https://www.bilibili.com/video/BV1qa4y1H7wp
《DAX神功》文字版合集:
https://www.bilibili.com/read/readlist/rl442274
《DAX神功》视频版合集:
https://www.bilibili.com/video/BV1YE411E7p3
PowerBI(DAX函数)、PowerQuery(M函数)、Python办公自动化、Python爬虫、Python数据分析、ExcelVBA、WordVBA、AccessVBA、MySQL等等