PowerBI之DAX神功:第2卷第2回 理解度量值中迭代函數(shù)的行數(shù)
前景回顧:
上節(jié)課?《PowerBI之DAX神功:答網(wǎng)友問03.VAR變量與惰性計算》

以第一行為例:
毛利額= Calculate(sumx('Sheet1',21),all(Sheet1))
因為Sheet1這張表有3行,所以21*3=63
sumx需要迭代的行數(shù),取決于第1參數(shù)表
我們間接的理解了,迭代函數(shù)行數(shù)在新建列上面的應(yīng)用。
新建列是行上下文,是逐行計算(迭代)。
度量值是篩選上下文
這節(jié)課我們主要講一下,度量值中迭代函數(shù)的行數(shù)
回憶《DAX神功》第1卷第19回 上下文轉(zhuǎn)換你還不知道的秘密
有一張表,表名叫'多端'


sum('多端'[銷量])? ?// 對多端這張表,銷量這列求和,sum是聚合函數(shù),它只是對這一列的數(shù)字進(jìn)行聚合,結(jié)果是60,公式推導(dǎo)如下:
度量值1=sumx('多端',60)
將【度量值1】放到矩陣中:

解釋:多端有6行,每行是60,所以總計6*60=360
當(dāng)矩陣的行標(biāo)題,使用年和商品時:

你會發(fā)現(xiàn)總計顯示360
關(guān)于這個問題,我在《DAX神功》第1卷第19回 上下文轉(zhuǎn)換你還不知道的秘密? 中跟大家介紹過,度量值有著將行上下文轉(zhuǎn)換成篩選上下文的功能,但是只能轉(zhuǎn)最外層的sumx。sumx內(nèi)層的行上下文它無法轉(zhuǎn)換。
sumx是媽媽,你娶了一個未婚先孕的媽媽,女人可以變成你的妻子,里面套著的sum是孩子與你沒有血緣關(guān)系。

如果我們不使用所有字段,而是只用年或商品字段時:


孩子不是你的,DNA無法改變,但是戶口本上可以隨你的姓
度量值1將sumx(媽媽)行上下文轉(zhuǎn)化為你的妻子
Calculate將sum(孩子)行上下文轉(zhuǎn)化為你的孩子

現(xiàn)在女人和孩子都是你的了,想什么篩選就怎么篩選。

正片開始:
還是這張表格:

度量值1 = sumx('多端',sum('多端'[銷量]))
等價公式
度量值2 = sumx('多端',sumx('多端','多端'[銷量]))
你學(xué)習(xí)度量值1時,你可能蒙圈了,因為它不直觀,而度量值2更易理解迭代函數(shù)的行數(shù)


如果我們想將度量值2的內(nèi)部與外部都轉(zhuǎn)換為篩選上下文:
度量值2= sumx('多端', calculate(sumx('多端', '多端'[銷量])))

單張表我們理解了,那多張表怎么處理呢?


度量值3 = sumx('一端',sumx('多端','一端'[售價]*'多端'[銷量]))
《DAX神功第1卷第18回》我講過,DAX所有函數(shù)計值順序都是從內(nèi)向外,包括Calculate和CalculateTable,并且用事實證明了。
第1步:我們先分析內(nèi)部的sumx計算情況

第2步:我們再分析外部的sumx計算情況

所以我們將這個度量值放到矩陣中:

我們只是用兩個表的商品字段舉例就可以了:


現(xiàn)在,想對內(nèi)層的實現(xiàn)篩選功能,在內(nèi)層的sumx外面套上Calculate
度量值3 = sumx('一端',CALCULATE(sumx('多端','一端'[售價]*'多端'[銷量])))

它報錯的意思是:在這里你不能省略關(guān)系函數(shù),因為原來是行上下文嵌套行上下文,你是否寫關(guān)系函數(shù)都可以,由于外層已經(jīng)引用了一端表,內(nèi)層可以直接寫:?'一端'[售價]
所以以下兩個度量值都是正確的
度量值3 = sumx('一端',sumx('多端','一端'[售價]*'多端'[銷量]))
度量值3 = sumx('一端',sumx('多端',RELATED('一端'[售價])*'多端'[銷量]))
當(dāng)你對內(nèi)層嵌套了Calculate,內(nèi)層是篩選上下文,外層是行上下文,由于上下文不同,所以這里的:?'一端'[售價]? 要使用關(guān)系函數(shù),這一點你忘記了也沒關(guān)系,系統(tǒng)會提示你
度量值3 = sumx('一端',CALCULATE(sumx('多端',RELATED('一端'[售價])*'多端'[銷量])))
還有另一種寫法:
度量值4 = sumx('一端',sumx(RELATEDTABLE('多端'),'一端'[售價]*'多端'[銷量]))
原理:
RELATED('一端'[售價])? ? ?// 多端從一端獲取
RELATEDTABLE('多端')? ?// 一端篩選多端表
而度量值4,使用了關(guān)系函數(shù)實現(xiàn)對內(nèi)層的篩選。
我們繞了一大圈,現(xiàn)在回到了《The Definitive Guide to DAX》中關(guān)于這節(jié)課的第一個案例。目的是告訴大家,學(xué)習(xí)英語,不止是“借鑒國外文獻(xiàn)”,更重要的是通過自己大腦分析,路不止一條,可能我走的路充滿荊棘,困難重重,但是我得到了你花錢買不到的鍛煉。

黃金哥哥不僅長得帥,能力還很強(qiáng)。他們是雅典娜最高級別的圣斗士。

但是,活到最后的,是青銅。

《孫興華講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辦公自動化、Python爬蟲、Python數(shù)據(jù)分析、ExcelVBA、WordVBA、AccessVBA、MySQL等等