Power BI之DAX神功:第2卷第19回 HASONEVALUE和SELECTEDVALUE函數(shù)
友情提示:關(guān)于計(jì)算組與DAX Studio隸屬外部工具,我會(huì)在不久的將來放到DLC中單獨(dú)講解
一、HASONEVALUE函數(shù)
《火力全開》筆記16.進(jìn)階條件判斷函數(shù) 我們對(duì)今天要講的兩個(gè)函數(shù)已經(jīng)進(jìn)行了案例講解,今天來講原理。
HASONEVALUE函數(shù)最常用的功能:讓總計(jì)/小計(jì)顯示為空

【度量值】計(jì)算季初至今



2021年合計(jì)和總計(jì)顯示的是2021年最后一個(gè)季度的值,這是正確的
如果你想將其變成2021年全年總和與整表總合,詳見《DAX神功》第2卷第4回
如果你想讓他變成空,就可以使用我們學(xué)過的If+HASONEVALUE 組合
【新建列】月 = MONTH('Sheet1'[日期])?
【度量值】QTD改 = if(HASONEVALUE('Sheet1'[月]),[QTD])


套公式大家都會(huì),但是今天我們講原理,以上面的案例為依據(jù),我們解讀一下:
【度量值】Values = COUNTROWS ( VALUES ('Sheet1'[月]) ) = 1
【度量值】DISTINCT = COUNTROWS ( DISTINCT('Sheet1'[月])) = 1
【度量值】HASONEVALUE = HASONEVALUE(Sheet1[月])
以上三個(gè)公式等價(jià)(人為制造障礙除外,比如一端表沒有的主鍵,在多端表外鍵中出現(xiàn)了,這屬于不懂?dāng)?shù)據(jù)庫基本常識(shí),即便是人為失誤,也應(yīng)該在數(shù)據(jù)清洗環(huán)節(jié)處理干凈)

原理學(xué)會(huì)了,我們拓展一下思路:假設(shè)只有一個(gè)月份就返回這個(gè)月份應(yīng)該怎么做?
【度量值】拓展思路 = if(HASONEVALUE(Sheet1[月]),DISTINCT('Sheet1'[月]))?
// 《DAX神功》第1卷第10回?將表用作標(biāo)量值

上面的案例,我們使用IF+HASONEVALUE組合,我們返回的是:如果月份去重后只有一行,我們就返回這個(gè)月份,否則返回Blank()。如果我想返回「二哈到底哈不哈」怎么辦?
【度量值】拓展思路 = if(HASONEVALUE(Sheet1[月]),DISTINCT('Sheet1'[月]),"「二哈到底哈不哈」")
二、SELECTEDVALUE函數(shù)
上面的案例我們使用了,
IF(HASONEVALUE(字段名), VALUES(字段名),否則返回什么)
或
IF(HASONEVALUE(字段名), DISTINCT(字段名),否則返回什么)
在這種情況下我們也可以使用SELECTEDVALUE函數(shù)代替IF+HASONEVALUE組合
注意:只限在這種情況下
如果某字段去重后只有一行,就以標(biāo)量值返回生成的表,否則返回空,如果注明了否則返回什么就返回什么,例如「二哈到底哈不哈」
IF(HASONEVALUE(字段名), VALUES(字段名),否則返回什么)
或
IF(HASONEVALUE(字段名),?DISTINCT(字段名),否則返回什么)
等價(jià)于
SELECTEDVALUE(字段名,否則返回什么)
【度量值】拓展思路1 =?SELECTEDVALUE(Sheet1[月],"「二哈到底哈不哈」")

三、SELECTEDVALUE函數(shù)應(yīng)用
講這個(gè)應(yīng)用之前我們先復(fù)習(xí)一下:Switch
DAX中的Switch比任天堂的Switch要厲害多了,我為了找到二者區(qū)別,在2021年1月買了一臺(tái)任天堂的Switch做對(duì)比,發(fā)現(xiàn)任天堂的Switch太LOW了,他只能在掌機(jī)和主機(jī)模式下切換。相比DAX下的Switch,任天堂還需努力哦:)

如上圖所示,如果Switch第1參數(shù)返回的是1,就返回"一月";以此類推
我們看一下《火力全開》中的案例:

【新建列】參數(shù)表 = {"銷售數(shù)量","銷售金額","毛利額"}
詳見《DAX神功》第1卷第3回?表名規(guī)范與表構(gòu)造函數(shù)

我們將參數(shù)表的Value字段放到切片器上:

并且在設(shè)置中將切片器單選:

我們每次是不是只能選一個(gè)?
【度量值】SELECTEDVALUE = SELECTEDVALUE('參數(shù)表'[Value])

再對(duì)比我們的Switch函數(shù):
切換 =
switch(SELECTEDVALUE('參數(shù)表'[Value]),
"銷售數(shù)量",sum('Sheet2'[銷售數(shù)量]),
"銷售金額",sum('Sheet2'[銷售金額]),
"毛利額",sum('Sheet2'[毛利額])
)

友情提示:《The Definitive Guide to DAX》本節(jié)課有一個(gè)案例,關(guān)于根據(jù)通貨膨脹率調(diào)整歷史銷售額,感興趣的朋友可以參考。

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