Power BI之DAX神功:第3卷第12回 什么是擴(kuò)展表
友情提示:計(jì)算組和DAX Studio隸屬外部工具,我會(huì)放到《DAX神功》DLC篇進(jìn)行講解,會(huì)于2022年初與SQL中高級(jí)篇同步開講。
一、什么是擴(kuò)展表
擴(kuò)展表原理我們一直在用,只是我一直沒告訴你。
你回憶一下,是不是我經(jīng)常這樣給大家解釋:

上面的學(xué)生表和成績表,當(dāng)我們將學(xué)生表(1端)主鍵(學(xué)號(hào))與成績表(多端)外鍵(學(xué)號(hào))連線時(shí)組成一對多關(guān)系。其實(shí)成績表就變成了下圖所示:
// 學(xué)生表中的學(xué)號(hào)列其實(shí)也包含在擴(kuò)展表中,因?yàn)橹貜?fù),所以省略

其原理:當(dāng)表與表之間是一對多關(guān)系時(shí),多端表可以獲取一端表所有的列(相當(dāng)于Vlookup),擴(kuò)展只針對多端表,一端表是篩選多端的,他不能擴(kuò)展。(特殊情況除外,下面會(huì)講)// 特殊情況:就是禁止你使用的情況,如果你有能力解決BUG你就用。
注意:我一直跟大家說,做分析,能用一張表不用兩張;能用兩張表不用三張;能用三張就不用四張;必需用四張含以上可能你不懂業(yè)務(wù)或者你是大神。沒有什么分析是不可以分開解決的。你的表越多,你要照顧的關(guān)系就越多,當(dāng)你對業(yè)務(wù)還不熟練時(shí),你還要分心去照顧技術(shù)問題,談何分析結(jié)果。
二、多張表時(shí)的擴(kuò)展表原理(正常情況下:一對多關(guān)系)

Ps: 一對多和多對一是一個(gè)意思,我這樣寫只是告訴你哪邊是多端,哪邊是一端。
上圖,從左向右一共4張表,我們假設(shè)它們是表1,表2,表3,表4
表1:它就是一端表,它沒有擴(kuò)展表,還有一種說法:它的擴(kuò)展表就是自己本身(廢話)。
表2:它可以擴(kuò)展所有表,表2~表1(多對一),表2~表3~表4(多對一,多對一)

表3:它無法擴(kuò)展表2中的列,因?yàn)樗?端而表2是多端,但是表3與表4的關(guān)系是一對多,所以表3可以擴(kuò)展表4的列

表4:它是一端表,所以它沒有擴(kuò)展表,或者說它的擴(kuò)展表就是它本身(廢話)。
我希望好良言可以勸得動(dòng)你:上面的模型中只有簡單的四張表,就分出這么多條路。我看了很多網(wǎng)友,剛開始學(xué)就將10多張表連在一起,結(jié)果不對,問我為什么?你這10多張表,我要檢查關(guān)系就要半小時(shí)以上,因?yàn)槟愕谋砀业墓ぷ骱翢o關(guān)系,誰有興趣去研究你的業(yè)務(wù)邏輯?你應(yīng)該清楚,表與表之間的連線并不像上面的模型那樣都是學(xué)生、成績、老師的關(guān)系,很大概率表關(guān)系是根據(jù)業(yè)務(wù)連線的。正常人都會(huì)通過數(shù)據(jù)清洗或者SQL獲取數(shù)據(jù)時(shí)拿到盡量少的表格,減少表格關(guān)系的處理。
// 當(dāng)然這不是絕對,根據(jù)每個(gè)人功力決定,比如我從3米的高度跳下來是極限了,再高我可能會(huì)把腿摔傷,但是,這個(gè)世界上肯定有高手,《天龍八部》、《射雕》、《神雕》、《倚天》那些高手可以在天上飛。
三、一對一和多對多關(guān)系下的擴(kuò)展表(特殊情況)
// 這個(gè)了解一下就好,是為了防抬扛才講的
再次重申:一對一關(guān)系,我們通過是將兩張表合并成一張表。多對多關(guān)系,我們通常會(huì)拆分一張多端表變成兩個(gè)一端表,連接另一個(gè)多端表,實(shí)現(xiàn)一對多關(guān)系。
今天只是講擴(kuò)展有原理,所以假設(shè)有人給自己添亂使用一對一或多對多關(guān)系。


上面我們談到只有多端表才有擴(kuò)展表,指的是一對多(單向關(guān)系)。實(shí)際上與本身是多端還是一端沒有關(guān)系,它的原理:擴(kuò)展表向一端延伸。
表1:表1可以獲取表2的所有列,所以表1擴(kuò)展表如下:

表2:表2可以獲取表1的所有列,所以表2擴(kuò)展表如下:

由于擴(kuò)展表原理:擴(kuò)展表向一端延伸。所以表2與表3是多對多關(guān)系,表2不能獲取表3的列。
表3:同理,也無法獲取表2的列,表3沒有擴(kuò)展表或者說擴(kuò)展表就是表3本身。
友情提示:一對一和多對多,你了解一下就好了,不用深究!凡是研究多對多和一對一關(guān)系的人,大多數(shù)喜歡說別人說話不嚴(yán)謹(jǐn),因?yàn)樗谔厥馇闆r下搞事情。我們在正常的一對多情況下,就是多端找1端,我們也不會(huì)去操作一對一和多對多關(guān)系。(網(wǎng)上很多裝懂的人抬扛其原因就在這里)
切記:正常人的表關(guān)系,都是一對多關(guān)系,都是單向箭頭,就可以了。
四、原生列與相關(guān)列
// 這里只是名詞解釋,將來你們看到這兩個(gè)詞時(shí),懂是什么意思就可以了
原生列:自己本身的列
相關(guān)列:又名擴(kuò)展列,就是從1端表V過來的列
如上圖所示:原生列就是表2本身。相關(guān)列就是從表1中V過來的列。因?yàn)閷W(xué)號(hào)列重復(fù),所以我省略了。

五、列篩選器的一般規(guī)則
牽一發(fā)而動(dòng)全身:牽一根頭發(fā)就帶動(dòng)整個(gè)身體。比喻觸動(dòng)一個(gè)極小的部分就會(huì)影響全局

如上圖所示,
如果篩選? ?表2[科目]:會(huì)影響表2和表3
如果篩選? ?表4[老師]:只會(huì)影響表4,而不會(huì)影響表3,因?yàn)閿U(kuò)展表原理
還是那句話:能用一張表,不用兩張表;能用兩張表,不用三張表;能用三張表,就用三張表;除非你的分析很簡單,否則不要超過三張表。(等你變成大神以后,100張表連在一起那是本事,但對于初學(xué)者來說這是笑話)
六、理解RELATED函數(shù)
《火力全開》第2課講的知識(shí)

關(guān)于這個(gè)問題《The Definitive Guide to DAX》講的太復(fù)雜了,簡單的說一下有如下兩張表:

日期表中的日期列,與Sheet1表中的入職列是實(shí)線關(guān)系,與離職列是虛線關(guān)系

【1】只考慮實(shí)線關(guān)系時(shí)
// 對Sheet1表添加日期表中的列,需要多端找一端。使用RELATED
返回結(jié)果:

由于日期表[日期]與Sheet1[入職]列建立1對多關(guān)系,所以Sheet1的擴(kuò)展表是根據(jù)自己入職列日期所對應(yīng)的日期表所有列V過來的結(jié)果:如下圖所示

【2】激活虛線關(guān)系,同時(shí)實(shí)線關(guān)系被暫時(shí)禁用
返回結(jié)果:

當(dāng)虛線關(guān)系激活時(shí),Sheet1的擴(kuò)展表是根據(jù)離職列去V日期表的所有列

總結(jié):其實(shí)很好理解,多端表上面的外鍵,去找一端表上的主鍵,引用一端表主鍵對應(yīng)的所有列(理解這句話的前提是看過我講的Access基礎(chǔ)篇)。
官方解釋:表擴(kuò)展行為發(fā)生在定義表時(shí),而不是使用表時(shí)。
七、如何在計(jì)算列中完成上述需求




上面的方法是單獨(dú)建立關(guān)系的情況下,如果沒有關(guān)系或虛線關(guān)系怎么辦?
因?yàn)镃alculatetable(表,篩選器或調(diào)節(jié)器),第一參數(shù)是表,RELATED函數(shù)引用的是列,所以RELATED函數(shù)不能用在Calculatetable第1參數(shù)中。
當(dāng)我在Calculatetable后面輸入re彈出的提示只有Relatedtable,但是這個(gè)函數(shù)是一端找多端時(shí)用的,可我現(xiàn)在是在多端表中新建列我需要找一端。
對不能使用RELATED函數(shù)官方也有解釋:RELATED函數(shù)需要行上下文,但是Calculatetable將行上下文轉(zhuǎn)換成了篩選上下文。我個(gè)人覺得:我的解釋更通俗易懂。

遇到這種情況,我們會(huì)借助LOOKUPVALUE函數(shù)來完成,表與表之間無關(guān)系可以直接V
《DAX神功》第1卷第5回 我們對LOOKUPVALUE函數(shù)做了詳細(xì)解釋,這里不再重復(fù)。

《孫興華講PowerBI火力全開》PowerBI必學(xué)課程
https://www.bilibili.com/video/BV1qa4y1H7wp
《DAX神功》文字版合集:
https://www.bilibili.com/read/readlist/rl442274
《DAX神功》視頻版合集:
https://www.bilibili.com/video/BV1YE411E7p3
PowerBI(DAX函數(shù))、PowerQuery(M函數(shù))、Python辦公自動(dòng)化、Python爬蟲、Python數(shù)據(jù)分析、ExcelVBA、WordVBA、AccessVBA、MySQL等等
https://www.bilibili.com/read/cv10222110