Power BI之DAX神功:第3卷第4回 ADDCOLUMNS函數(shù) 你不一定會用
《孫興華講PowerBI火力全開》第26課 我們學習了ADDCOLUMNS函數(shù)
今天我們細講這個函數(shù)的原理


一、只能應用于新建表,不能應用于新建列
ADDCOLUMNS函數(shù)返回的是一張表,當然是表函數(shù)了,可是抬扛的人會說沒講原理,那就講原理唄,滿足哈羅雷球白夕尚*的需求。
【1】新建表
新建表1 = ADDCOLUMNS('花名冊',"總分",CALCULATE(SUM('成績表'[分數(shù)])))
//?CALCULATE(SUM('成績表'[分數(shù)])) 可以使用度量值代替,例如:總分數(shù)=SUM('成績表'[分數(shù)])

新建表2 = ADDCOLUMNS(VALUES('花名冊'[姓名]),"總分",CALCULATE(SUM('成績表'[分數(shù)])))
新建表2 = ADDCOLUMNS(DISTINCT('花名冊'[姓名]),"總分",CALCULATE(SUM('成績表'[分數(shù)])))

注意:ADDCOLUMNS是迭代函數(shù),是行上下文,迭代第1參數(shù)那張表的每一行所有列。
所以第3參數(shù),必需具有篩選功能才能適配每一個姓名,要么我們使用度量值,要么就套上calculate進行上下文轉(zhuǎn)換。
如果我們沒有轉(zhuǎn)換第三參數(shù),就會顯示所有人員成績總和:5+7+9=21
新建表3 = ADDCOLUMNS(DISTINCT('花名冊'[姓名]),"總分",SUM('成績表'[分數(shù)]))

【2】不可以應用于新建列
【錯誤】新建列 = ADDCOLUMNS('花名冊',"總分",CALCULATE(SUM('成績表'[分數(shù)])))

這里要搞清楚新建表和新建列的區(qū)別:
新建表的計算順序:

新建列的計算順序:

我們上圖使用Addcolumns返回了一張多行多列的表,它不轉(zhuǎn)成標量值。《DAX神功》第1卷第10回 將表用作標量? 中我們講過的知識,如下圖所示:只有一行一列一個單元格的表才能轉(zhuǎn)成標量值

那應該怎么做?
新建列 = CALCULATE(SUM('成績表'[分數(shù)]))
或者寫成
【度量值】總分數(shù)=SUM('成績表'[分數(shù)])
新建列=[總分數(shù)]

計算原理:

二、可以增加多個計算列并實現(xiàn)篩選
【度量值】總分數(shù)=SUM('成績表'[分數(shù)])
【度量值】平均分=AVERAGE('成績表'[分數(shù)])
【新建表】新建表 = ADDCOLUMNS('花名冊',"總分",[總分數(shù)],"平均分",[平均分])

新建表1 = filter(ADDCOLUMNS('花名冊',"總分",[總分數(shù)],"平均分",[平均分]),[平均分]>3)

新建表2 = FILTER('花名冊',[平均分]>3)
// 不使用Addcolumns我們也能找到符合條件的人,但是不能顯示添加的列

三、使用 ADDCOLUMNS 代替 SUMMARIZECOLUMNS
因SUMMARIZECOLUMNS不能應用于大多數(shù)度量值,所以我們使用SUMMARIZE+ADDCOLUMNS的組合來實現(xiàn)。
詳見《DAX神功》第1卷第15課
四、網(wǎng)友提問
問:《權(quán)威指南》關(guān)于這一節(jié)的計算占銷售額15%的產(chǎn)品集合,看不懂。
答:受中西方文化的影響,此問題他標題描述不到位,但是人家下面有步驟說明,你看他過程應該能猜出來意思的。下圖是我在Excel中進行的數(shù)據(jù)模擬

如上圖所示,
1.前兩列是原始表,我在Excel中算出銷售這一列的總和是465,新建總銷售這一列,全部填充465。
2.用每個商品的 銷售 / 總銷售 = 每個商品銷售的占比。再找出占前15%的商品。此案例我故意將銷售從1至30從小到大排列,這樣它肯定是從最后開始取6.24%+6.45%=12.69%,所以就取A29和A30。
3.右邊是我找到的規(guī)律,只要找到比銷售當前行大的所有行求和再除以465,少于15%的就是我要的。
4.我跟大家一再重復,一道題你人不會做,計算機就不會做,你可能會說,我要會還學DAX干嘛?我回復有這種想法的人:如果DAX能代替你,還要你干嘛?
5.數(shù)據(jù)分析,至少要有小學數(shù)學基礎(chǔ)(不是會考試,是真的懂),你忘記了數(shù)學知識,是因為你工作中用不到,我英語發(fā)音也忘光了,因為我用不到。大家的腦袋都差不多,誰也不可能將所有東西都裝進去,但是選擇裝什么內(nèi)容,是自己決定的。有一些人喜歡抬扛,他們說科學家口語好,數(shù)學也好,請問科學家打游戲嗎?普通人能與科學家比嗎?你為何沒成為科學家呢?如果人人都是科學家,那PS/XBOX/SWITCH/企鵝...這些在國內(nèi)就沒銷售了。

我們一步一步通過測試做出結(jié)果:
第1步:建立度量值
分配銷售 = sum(Sheet3[銷售])
第2步:新建表,取商品列不重復值構(gòu)成的表,添加銷售列,將度量值分配給每一個值
// 我們只需要商品列,所以要用Values(列)或DISTINCT(列),同時也能杜絕因商品列有重復值時造成的錯誤。這一步好比Excel函數(shù)中的 sumif?

第3步:從第一行開始,凡是比當前行銷售大的表,就統(tǒng)計他的銷售總計是多少,寫在新建列移動總計上面。
Var y=tb1[銷售]? ?指當前行指定單元格? 《DAX神功》第1卷第14回
filter(tb1,tb1[銷售]>=y)? ?篩選tb1中銷售列大于等于當前行銷售單元格值的所有行
sumx(表,表達式)? ?=>? ?sumx(篩選后的表,指定列)? ?=> 對篩選后的這張表指定列求和

第4步:這一步我們只是測試
懶惰計算:詳見《DAX神功》答網(wǎng)友問04

我們使用移動總計除以測試,就得到了百分比:跟我在Excel里推導的結(jié)果是一樣的

第5步:篩選百分比小于等于15%的

tb3是我們測試讓你看到效果用的,實際使用中,tb3是可以省略的


孫興華講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函數(shù))、PowerQuery(M函數(shù))、Python辦公自動化、Python爬蟲、Python數(shù)據(jù)分析、ExcelVBA、WordVBA、AccessVBA、MySQL等等
https://www.bilibili.com/read/cv10222110