欢迎光临散文网 会员登陆 & 注册

Power BI之DAX神功:第3卷第12回 什么是扩展表

2021-12-08 12:42 作者:孙兴华zz  | 我要投稿

友情提示:计算组和DAX Studio隶属外部工具,我会放到《DAX神功》DLC篇进行讲解,会于2022年初与SQL中高级篇同步开讲。

一、什么是扩展表

扩展表原理我们一直在用,只是我一直没告诉你。

你回忆一下,是不是我经常这样给大家解释:

上面的学生表和成绩表,当我们将学生表(1端)主键(学号)与成绩表(多端)外键(学号)连线时组成一对多关系。其实成绩表就变成了下图所示:

// 学生表中的学号列其实也包含在扩展表中,因为重复,所以省略

其原理:当表与表之间是一对多关系时,多端表可以获取一端表所有的列(相当于Vlookup),扩展只针对多端表,一端表是筛选多端的,他不能扩展。(特殊情况除外,下面会讲)// 特殊情况:就是禁止你使用的情况,如果你有能力解决BUG你就用。

注意:我一直跟大家说,做分析,能用一张表不用两张能用两张表不用三张能用三张就不用四张必需用四张含以上可能你不懂业务或者你是大神。没有什么分析是不可以分开解决的。你的表越多,你要照顾的关系就越多,当你对业务还不熟练时,你还要分心去照顾技术问题,谈何分析结果。

二、多张表时的扩展表原理(正常情况下:一对多关系)

Ps: 一对多和多对一是一个意思,我这样写只是告诉你哪边是多端,哪边是一端。

上图,从左向右一共4张表,我们假设它们是表1,表2,表3,表4

表1:它就是一端表,它没有扩展表,还有一种说法:它的扩展表就是自己本身(废话)。

表2:它可以扩展所有表,表2~表1(多对一),表2~表3~表4(多对一,多对一)

表2扩展后的表

表3:它无法扩展表2中的列,因为它是1端而表2是多端,但是表3与表4的关系是一对多,所以表3可以扩展表4的列

表3扩展后的表

表4:它是一端表,所以它没有扩展表,或者说它的扩展表就是它本身(废话)。

我希望好良言可以劝得动你:上面的模型中只有简单的四张表,就分出这么多条路。我看了很多网友,刚开始学就将10多张表连在一起,结果不对,问我为什么?你这10多张表,我要检查关系就要半小时以上,因为你的表跟我的工作毫无关系,谁有兴趣去研究你的业务逻辑?你应该清楚,表与表之间的连线并不像上面的模型那样都是学生、成绩、老师的关系,很大概率表关系是根据业务连线的。正常人都会通过数据清洗或者SQL获取数据时拿到尽量少的表格,减少表格关系的处理。

// 当然这不是绝对,根据每个人功力决定,比如我从3米的高度跳下来是极限了,再高我可能会把腿摔伤,但是,这个世界上肯定有高手,《天龙八部》、《射雕》、《神雕》、《倚天》那些高手可以在天上飞。

三、一对一和多对多关系下的扩展表(特殊情况)

// 这个了解一下就好,是为了防抬扛才讲的

再次重申:一对一关系,我们通过是将两张表合并成一张表。多对多关系,我们通常会拆分一张多端表变成两个一端表,连接另一个多端表,实现一对多关系。

今天只是讲扩展有原理,所以假设有人给自己添乱使用一对一或多对多关系。

上面我们谈到只有多端表才有扩展表,指的是一对多(单向关系)。实际上与本身是多端还是一端没有关系,它的原理:扩展表向一端延伸。

表1:表1可以获取表2的所有列,所以表1扩展表如下:

表2:表2可以获取表1的所有列,所以表2扩展表如下:

由于扩展表原理:扩展表向一端延伸。所以表2与表3是多对多关系,表2不能获取表3的列。

表3:同理,也无法获取表2的列,表3没有扩展表或者说扩展表就是表3本身。

友情提示:一对一和多对多,你了解一下就好了,不用深究!凡是研究多对多和一对一关系的人,大多数喜欢说别人说话不严谨,因为它在特殊情况下搞事情。我们在正常的一对多情况下,就是多端找1端,我们也不会去操作一对一和多对多关系。(网上很多装懂的人抬扛其原因就在这里)

切记:正常人的表关系,都是一对多关系,都是单向箭头,就可以了。

四、原生列与相关列

// 这里只是名词解释,将来你们看到这两个词时,懂是什么意思就可以了

原生列:自己本身的列

相关列:又名扩展列,就是从1端表V过来的列

如上图所示:原生列就是表2本身。相关列就是从表1中V过来的列。因为学号列重复,所以我省略了。

五、列筛选器的一般规则

牵一发而动全身:牵一根头发就带动整个身体。比喻触动一个极小的部分就会影响全局

如上图所示,

如果筛选   表2[科目]:会影响表2和表3

如果筛选   表4[老师]:只会影响表4,而不会影响表3,因为扩展表原理

还是那句话:能用一张表,不用两张表;能用两张表,不用三张表;能用三张表,就用三张表;除非你的分析很简单,否则不要超过三张表。(等你变成大神以后,100张表连在一起那是本事,但对于初学者来说这是笑话)

六、理解RELATED函数

《火力全开》第2课讲的知识

关于这个问题《The Definitive Guide to DAX》讲的太复杂了,简单的说一下有如下两张表:

日期表中的日期列,与Sheet1表中的入职列是实线关系,与离职列是虚线关系

【1】只考虑实线关系时

// 对Sheet1表添加日期表中的列,需要多端找一端。使用RELATED

返回结果:

由于日期表[日期]Sheet1[入职]列建立1对多关系,所以Sheet1的扩展表是根据自己入职列日期所对应的日期表所有列V过来的结果:如下图所示

【2】激活虚线关系,同时实线关系被暂时禁用

返回结果:

当虚线关系激活时,Sheet1的扩展表是根据离职列去V日期表的所有列

总结:其实很好理解,多端表上面的外键,去找一端表上的主键,引用一端表主键对应的所有列(理解这句话的前提是看过我讲的Access基础篇)。

官方解释:表扩展行为发生在定义表时,而不是使用表时。

七、如何在计算列中完成上述需求

上面的方法是单独建立关系的情况下,如果没有关系或虚线关系怎么办?

因为Calculatetable(表,筛选器或调节器),第一参数是表,RELATED函数引用的是列,所以RELATED函数不能用在Calculatetable第1参数中。

当我在Calculatetable后面输入re弹出的提示只有Relatedtable,但是这个函数是一端找多端时用的,可我现在是在多端表中新建列我需要找一端。

对不能使用RELATED函数官方也有解释:RELATED函数需要行上下文,但是Calculatetable将行上下文转换成了筛选上下文。我个人觉得:我的解释更通俗易懂。

遇到这种情况,我们会借助LOOKUPVALUE函数来完成,表与表之间无关系可以直接V

《DAX神功》第1卷第5回 我们对LOOKUPVALUE函数做了详细解释,这里不再重复。

《孙兴华讲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等等

https://www.bilibili.com/read/cv10222110

Power BI之DAX神功:第3卷第12回 什么是扩展表的评论 (共 条)

分享到微博请遵守国家法律