Power BI之DAX神功:第3卷第11回 創(chuàng)建計(jì)算表的四個(gè)常用函數(shù)
一、SELECTCOLUMNS函數(shù)
《火力全開(kāi)》筆記26 我們已經(jīng)對(duì)這個(gè)函數(shù)的語(yǔ)法講解過(guò)了,語(yǔ)法不再重復(fù),現(xiàn)在我們講原理
【1】SELECTCOLUMNS與SQL語(yǔ)句中的SELECT...From
《火力全開(kāi)》視頻第0集建議大家先學(xué)習(xí)Access基礎(chǔ)篇,我的Access基礎(chǔ)篇與PowerBI銜接。讓你快速理解什么是數(shù)據(jù)庫(kù)(包含數(shù)據(jù)規(guī)范),多表關(guān)系如何處理等知識(shí)。
假設(shè)我們數(shù)據(jù)庫(kù)中有這樣一張表:

我們想增加一個(gè)總分列,如果直接在表中增加,就相當(dāng)于DAX里面的AddColumns
但是,如果這張表不想讓它發(fā)生改變,想生成一張新的表,實(shí)現(xiàn)增加列就可以使用SELECTCOLUMNS

現(xiàn)在是不是能更好的理解上面這段話(huà)了?當(dāng)我們?cè)跀?shù)據(jù)庫(kù)的表中選擇某列并生成新列,如下圖所示:

結(jié)果如下:現(xiàn)在你看到的結(jié)果和原表有關(guān)系沒(méi)?有關(guān)系!是原表嗎?不是!

其實(shí)將上述過(guò)程寫(xiě)成SQL語(yǔ)句:
SELECT 姓名, [平時(shí)成績(jī)]*0.3+[考試成績(jī)]*0.7 AS 總分 FROM 表1
現(xiàn)在我們將下面這張表放到PowerBI中,使用我們的DAX函數(shù)SELECTCOLUMNS來(lái)演示:

公式如下:

DAX語(yǔ)言相比SQL晚了有20多年。DAX語(yǔ)言基于SQL思維,這一點(diǎn)官方是認(rèn)同的。
【2】SELECTCOLUMNS與SUMMARIZECOLUMNS、SUMMARIZE的區(qū)別
《The Definitive Guide to DAX》中聲明了它們的區(qū)別,我用自己的語(yǔ)言來(lái)講一下:
SELECTCOLUMNS:選擇列,添加新列,生成一張新的表。不分組就相當(dāng)于不去重。
SUMMARIZECOLUMNS、SUMMARIZE:分組!相當(dāng)于SQL中的Group by,分組必去重。
以下圖為例:

同樣的公式:
結(jié)果不去重:

當(dāng)我們使用SUMMARIZECOLUMNS或SUMMARIZE時(shí):
結(jié)果返回:結(jié)果去重,當(dāng)然這里使用sum只出于教學(xué)目的,實(shí)戰(zhàn)中應(yīng)該使用Average

當(dāng)使用Average時(shí):
返回結(jié)果:

還是那句話(huà):沒(méi)有什么時(shí)候應(yīng)該用什么這種說(shuō)法!你的分析中需要用什么你就選擇什么!切記:DAX不能代替人腦,它只是計(jì)算工具。
【3】SELECTCOLUMNS在數(shù)據(jù)沿襲中的應(yīng)用
《The Definitive Guide to DAX》中只提到一種情況,然而情況有很多種,我在《DAX神功》第2卷第21回 數(shù)據(jù)沿襲 中做了充分證明,這里我不在重復(fù)講過(guò)的內(nèi)容。我相信看到這里的小伙伴已經(jīng)看過(guò)數(shù)據(jù)沿襲這節(jié)課了。當(dāng)然你是否還記得那節(jié)課講的是什么,我就不清楚了。
二、創(chuàng)建靜態(tài)單行表ROW函數(shù)【可被表構(gòu)造函數(shù)代替】
《火力全開(kāi)》筆記24.03中我們介紹了ROW函數(shù)的語(yǔ)法
作用:創(chuàng)建只有一行的表(可以是單列或多列)

【度量值】平時(shí)總分 = sum(Sheet1[平時(shí)成績(jī)])?
【度量值】考試總分 = SUM(Sheet1[考試成績(jī)])?
新建表3 = row("平時(shí)分",[平時(shí)總分],"考試分",[考試總分])

注意:新建表中無(wú)論使用度量值還是表達(dá)式,最終返回的均是一個(gè)值。下面的公式用來(lái)證明
新建表4 = row("平時(shí)分",sum(Sheet1[平時(shí)成績(jī)]),"考試分",sum(Sheet1[考試成績(jī)]))

我們可以使用構(gòu)造表函數(shù)代替ROW函數(shù):
新建表5 = {([平時(shí)總分],[考試總分])}
新建表6 = {(sum(Sheet1[平時(shí)成績(jī)]),sum(Sheet1[考試成績(jī)]))}

《The Definitive Guide to DAX》中指出表構(gòu)造函數(shù)的缺點(diǎn)是不能自定義字段名稱(chēng),PowerBI中不存在這樣的問(wèn)題:
《DAX神功》第1卷第3回 我們就講到了這個(gè)方法
返回結(jié)果:

總結(jié):無(wú)論你使用ROW函數(shù)還是表構(gòu)造函數(shù),沒(méi)有什么區(qū)別,開(kāi)心就好!
三、創(chuàng)建靜態(tài)表:DATATABLE函數(shù)【可被表構(gòu)造函數(shù)代替】
【1】標(biāo)準(zhǔn)語(yǔ)法
《火力全開(kāi)》筆記16.2中我們講解了DATATABLE函數(shù)的語(yǔ)法
生成單列的表:
返回結(jié)果:

生成多列的表:
返回結(jié)果:

數(shù)據(jù)類(lèi)型:

【2】不要與表構(gòu)造函數(shù)混淆
{{"數(shù)據(jù)11","數(shù)據(jù)12"},{"數(shù)據(jù)21","數(shù)據(jù)22"}} // 這不是表構(gòu)造函數(shù)

{("數(shù)據(jù)11","數(shù)據(jù)12"),("數(shù)據(jù)21","數(shù)據(jù)22")} // 這才是表構(gòu)造函數(shù)

表構(gòu)造函數(shù)每個(gè)小括號(hào)代表一行,大括號(hào)代表整張表。
【3】DATATABLE函數(shù)只能使用常量,不能使用度量值或表達(dá)式
我們剛剛講ROW函數(shù)可以被表構(gòu)造函數(shù)代替時(shí),向大家演示了,表構(gòu)造函數(shù)支持度量值或表達(dá)式。(其實(shí)度量值也是表達(dá)式生成的)
例如表構(gòu)造函數(shù):
返回結(jié)果:

但是在DATATABLE函數(shù)中就不可以:
返回錯(cuò)誤提示:

注意:DATATABLE 函數(shù)限制表的內(nèi)容必須是常量,不支持任何 DAX 表達(dá)式(度量值)。
【4】為什么說(shuō)它可以被代替我們舉例說(shuō)明

使用Filter反復(fù)篩選同一列:
返回結(jié)果:但是肯定沒(méi)人有會(huì)這樣做。

我們應(yīng)該怎么做?是不是利用表構(gòu)造函數(shù)?
所以說(shuō)表構(gòu)造函數(shù)是最簡(jiǎn)單、最容易理解的。如果我們換成DATATABLE函數(shù)結(jié)果是一樣的。
但你是不是認(rèn)為這畫(huà)蛇添足了?還有更繞你的方法:請(qǐng)往下看
新建表12中我們使用in檢查一個(gè)值是否存在于表中
'Sheet1'[姓名] in {"張三","李四","王五"}
in的等價(jià)函數(shù)是Containsrow
Containsrow(?{"張三","李四","王五"},'Sheet1'[姓名])? // 等價(jià)于'Sheet1'[姓名]?in?{"張三","李四","王五"}
還有另外一個(gè)等價(jià)函數(shù)Contains,《火力全開(kāi)》筆記24.01中講過(guò)
Contains({"張三","李四","王五"},[value],'Sheet1'[姓名])??//?等價(jià)于'Sheet1'[姓名]?in?{"張三","李四","王五"}
以上等價(jià)公式我是使用單列進(jìn)行舉例,如果多列同樣可以使用。
接下來(lái)我們分步驟實(shí)現(xiàn):
表 = DATATABLE ("人名", STRING,{ { "張三" }, { "李四" }, { "王五" } })

我們使用Containsrow或Contains函數(shù)代替in函數(shù):
返回結(jié)果:DAX函數(shù)就是這樣,你想繞,他就陪著你繞。

記?。篋ATATABLE函數(shù)可以被表構(gòu)造函數(shù)代替就可以了。同理Contains和Containsrow大多數(shù)情況下也能被in代替。
四、GENERATESERIES函數(shù)
《DAX神功》第2卷第6回 我們使用GENERATESERIES函數(shù)制作分段排名,例如:每20分一個(gè)檔位。具體案例大家可以詳見(jiàn)這節(jié)課。
另外,我們?cè)?strong>《PowerBI論數(shù)據(jù)清洗重要性》這個(gè)視頻中,也使用了GENERATESERIES函數(shù)做生成笛卡兒積表的“助推火箭”!
https://www.bilibili.com/video/BV13R4y1E774?spm_id_from=333.999.0.0
當(dāng)然,在《The Definitive Guide to DAX》中提到的案例對(duì)部分人員非常有價(jià)值,對(duì)我來(lái)說(shuō)分析就截止到年月日,不涉及小時(shí),分鐘和秒。但是有些行業(yè)可以利用GENERATESERIES函數(shù)生成時(shí)間表。如下圖所示:

這個(gè)時(shí)候,我們就可以使用Selectcolumns選擇生成新列,同時(shí)會(huì)用到Format函數(shù)
《火力全開(kāi)》第18課中有Format函數(shù)詳細(xì)語(yǔ)法,你不需要背下來(lái),用的時(shí)候去查
// Ps: @二哈到底哈不哈,我使用的是《火力全開(kāi)》筆記18附1日期格式中的方法,與書(shū)中方法不同。但是SELECTCOLUMNS和GENERATESERIES的語(yǔ)法是微軟開(kāi)發(fā)的,我無(wú)法改變其語(yǔ)法。就好比羅老師講法,他有自己的講法,但是法律條文是什么樣就什么樣,不能改。法律條文就相當(dāng)于這里的語(yǔ)法。

我們之前可以新建日期表,同理我們現(xiàn)在制作的是時(shí)間表,當(dāng)你放在切片器上就可以有更多選擇進(jìn)行篩選。

《孫興華講PowerBI火力全開(kāi)》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爬蟲(chóng)、Python數(shù)據(jù)分析、ExcelVBA、WordVBA、AccessVBA、MySQL等等
https://www.bilibili.com/read/cv10222110