PowerBI之DAX神功:第1卷第22回 Calculate調(diào)節(jié)器之CROSSFILTER函數(shù)
上節(jié)課我們學(xué)習(xí)了USERELATIONSHIP函數(shù)功能是啟用備胎關(guān)系(虛線),并終止現(xiàn)任關(guān)系(實(shí)線)
截止上節(jié)課,我們已經(jīng)完整的學(xué)習(xí)了,Calculate兩個(gè)調(diào)節(jié)器函數(shù),分別是ALL函數(shù)和USERELATIONSHIP函數(shù)
并且了解到KEEPFILTERS是篩選參數(shù)調(diào)節(jié)器(只是將不能篩選的參數(shù)恢復(fù)篩選),它并不是Calculate調(diào)節(jié)器,KEEPFILTERS不止只可以在Calculate中使用,同時(shí)也可以在迭代函數(shù)中使用,例如 Sumx(keepfilters(ALL(表[列])),表達(dá)式)
同時(shí),學(xué)習(xí)了Calculate調(diào)節(jié)器(等級(jí))優(yōu)先于篩選器,同級(jí)別從左向右執(zhí)行。
接下來,我們?cè)倭私庖幌骂愃坪瘮?shù):CROSSFILTER函數(shù),函數(shù)本身不返回任何值,只改變參數(shù)內(nèi)的關(guān)系
這個(gè)函數(shù)并不是特別重要,它有等價(jià)函數(shù)可以代替其功能
但是,你仍然要保證表與表之間是一對(duì)多關(guān)系(我們不討論一對(duì)一與多對(duì)多關(guān)系)
《DAX神功》第1卷第1回已經(jīng)明確一對(duì)多原則,一百年不許變。

《孫興華講PowerBI火力全開》筆記28.03對(duì)這個(gè)函數(shù)做了詳細(xì)講解
詳細(xì)案例請(qǐng)參考《火力全開》


【1】使用CROSSFILTER函數(shù)前提兩表之間有實(shí)線關(guān)系
如果你兩張表之間本身就沒有連線,這個(gè)函數(shù)無法幫你連線。
【2】第1參數(shù)和第2參數(shù)的位置無所謂,它可以自動(dòng)識(shí)別
度量值1 = CALCULATE(SUM('多端'[分?jǐn)?shù)]),CROSSFILTER('一端'[學(xué)號(hào)],'多端'[學(xué)號(hào)],None))
等價(jià)
度量值1 = CALCULATE(SUM('多端'[分?jǐn)?shù)]),CROSSFILTER('多端'[學(xué)號(hào)],'一端'[學(xué)號(hào)],None))
【3】第3參數(shù):None 無篩選? 其實(shí)就是禁用關(guān)系,將原本的連線臨時(shí)刪除
但是,它與USERELATIONSHIP函數(shù)一樣,都是在這個(gè)度量值里面生效的。
就好比在Access中跟大家講的,兩個(gè)表連線是結(jié)婚的關(guān)系,而查詢中的兩個(gè)表連線是演員演夫妻的關(guān)系。現(xiàn)在就是演員演夫妻的關(guān)系。
USERELATIONSHIP函數(shù)與CROSSFILTER函數(shù),他們對(duì)關(guān)系的處理都是在本度量值之內(nèi)生效的,并沒有改變?cè)缄P(guān)系模型。
例如:我想得到多端表中分?jǐn)?shù)的度量值,但是不想讓一端表中的字段篩選它
但是,由于一端表與多端表是一對(duì)多關(guān)系,一端表本身具有篩選多端表的功能
我可以在度量值1中取消兩表之間的連線關(guān)系:
度量值1 = CALCULATE(SUM('多端'[分?jǐn)?shù)]),CROSSFILTER('一端'[學(xué)號(hào)],'多端'[學(xué)號(hào)],None))

由于USERELATIONSHIP函數(shù)功能是啟用備胎關(guān)系(虛線),并終止現(xiàn)任關(guān)系(實(shí)線)
如果你是想將現(xiàn)任關(guān)系(實(shí)線)終止,而不啟用任何備胎(虛線)關(guān)系時(shí),這個(gè)函數(shù)就派上用場(chǎng)了。但是方法不止一種,ALL函數(shù)同樣可以實(shí)現(xiàn)一端表所有列不能篩選,例如:度量值2
度量值2 = CALCULATE(SUM('多端'[分?jǐn)?shù)]),all('一端'))
【4】第3參數(shù):Both? 雙向篩選
《DAX神功》第1卷第2回 避免使用雙向箭頭? 中做了明確的說明 不建議大家使用雙向箭頭
【5】第3參數(shù):Oneway? 單向篩選
(1)如果關(guān)系模型中是雙向篩選,你可以在度量值中將其改成單向篩選
但是,我始終就不建議你使用雙向篩選關(guān)系
(2)提升速度
【度量值】總分1 = sum('多端'[分?jǐn)?shù)])
【度量值】總分2 = CALCULATE(sum('多端'[分?jǐn)?shù)]),CROSSFILTER('一端'[學(xué)號(hào)],'多端'[學(xué)號(hào)],OneWay))

由于兩張表之間是一對(duì)多關(guān)系,一端可以篩選多端
但是你寫的【總分1】,直接放到模型中,當(dāng)數(shù)據(jù)量較大時(shí),速度會(huì)慢,因?yàn)樗鼤?huì)通過矩陣中一端表的學(xué)號(hào)篩選【總分1】
如果寫成【總分2】的樣子,它在度量值內(nèi)部就已經(jīng)使用了關(guān)系篩選,提升速度。
Ps: 速度是虛無飄渺的事情,如果數(shù)據(jù)量太大,就不建議使用PowerBI了。介時(shí),你可以考慮SQL或Pandas等
【6】calculate多層嵌套CROSSFILTER時(shí)最內(nèi)層生效
同上節(jié)課的USERELATIONSHIP函數(shù)
Ps: 第3參數(shù)還有兩個(gè)OneWay_LeftFiltersRight和OneWay_RightFiltersLeft不用學(xué)習(xí)了。

《孫興華講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?