PowerBI之DAX神功:答網(wǎng)友問(wèn)05 返回表的迭代函數(shù)你應(yīng)該注意什么?
說(shuō)明:
關(guān)于《The Definitive Guide to DAX》中介紹的CONCATENATEX函數(shù)
在《孫興華講PowerBI火力全開(kāi)》筆記25課03和04中做了詳細(xì)講解,并舉有案例
前景回顧:
在《DAX神功》答網(wǎng)友問(wèn)04中

提問(wèn)網(wǎng)友的需求:獲取每個(gè)月份最大銷(xiāo)售金額及產(chǎn)生最大金額的銷(xiāo)售日期?
度量值如下:
銷(xiāo)售金額 = sumx('銷(xiāo)售表',RELATED('商品表'[售價(jià)])*'銷(xiāo)售表'[銷(xiāo)量])
銷(xiāo)售峰值3 = maxx('日期表',[銷(xiāo)售金額])??
發(fā)生日期 =
? ? ? ? var x=maxx('日期表',[銷(xiāo)售金額])
? ? ? ? var tb=FILTER(VALUES('日期表'[日期]),[銷(xiāo)售金額]=x)
return
? ? ? ? IF(COUNTROWS(tb)=1,tb,BLANK())?
Ps: 度量值【發(fā)生日期】寫(xiě)法可不只這一種哦,詳見(jiàn)上節(jié)課。
正片開(kāi)始:
《孫興華講PowerBI火力全開(kāi)》第26課用了16分鐘的時(shí)間講了兩個(gè)函數(shù),分別是:
ADDCOLUMNS與SELECTCOLUMNS
關(guān)于這兩個(gè)函數(shù)的語(yǔ)法及案例,詳見(jiàn)《孫興華講PowerBI火力全開(kāi)》第26課
ADDCOLUMNS是在指定表中增加一列或多列:

SELECTCOLUMNS是在指定表中選擇一列或多列:

還是《DAX神功》答網(wǎng)友問(wèn)04的案例:

我們換一種思路,求銷(xiāo)售鋒值發(fā)生的日期:
第一步:我們計(jì)算銷(xiāo)售金額,再寫(xiě)一個(gè)銷(xiāo)售峰值3度量值備用
【度量值】銷(xiāo)售金額 = sumx('銷(xiāo)售表',RELATED('商品表'[售價(jià)])*'銷(xiāo)售表'[銷(xiāo)量])?
【度量值】銷(xiāo)售峰值3?= maxx('日期表',[銷(xiāo)售金額])??
第二步:我們通過(guò)添加列,將銷(xiāo)售金額新增到日期表中
【新建表】表1 = ADDCOLUMNS(VALUES('日期表'[日期]),"銷(xiāo)售金額",[銷(xiāo)售金額])

第三步:篩選表1中最大金額的
【新建表】表2 = FILTER('表1','表1'[銷(xiāo)售金額]=maxx('表1',[銷(xiāo)售金額]))

第四步:我們要取標(biāo)量值,所以選擇表2中的日期列(相當(dāng)于取一個(gè)單元格)
【新建表】表3 = SELECTCOLUMNS('表2',"日期",'表2'[日期])

第五步:綜合以上公式寫(xiě)成VAR形式的度量值
峰值日期1 =?
? ? var tb1=ADDCOLUMNS(VALUES('日期表'[日期]),"銷(xiāo)售金額",[銷(xiāo)售金額])
? ? var x= [銷(xiāo)售峰值3]
return
SELECTCOLUMNS(
? ? FILTER(tb1,[銷(xiāo)售金額]= x),"日期",'日期表'[日期])
Ps: 雖然返回的是一張表,但是這個(gè)表只有一行一列,可以以標(biāo)量值輸出。

當(dāng)然,這個(gè)公式只是在理想狀態(tài)下的,如果使用Filter篩選tb1時(shí),當(dāng)最大銷(xiāo)售金額日期不只一個(gè)(假設(shè)1月份最大銷(xiāo)售金額有3天都是并列第一),那就會(huì)報(bào)錯(cuò)了。詳見(jiàn)《DAX神功》第1卷第10回
第六步:我們通過(guò)《DAX神功》答網(wǎng)友問(wèn)04,將度量值公式寫(xiě)成:
峰值日期1 =?
? ? var tb1=ADDCOLUMNS(VALUES('日期表'[日期]),"銷(xiāo)售金額",[銷(xiāo)售金額])
? ? var x=?[銷(xiāo)售峰值3]
? ? var tb2=SELECTCOLUMNS(
? ? ? ? FILTER(tb1,[銷(xiāo)售金額]= x),"日期",'日期表'[日期])
return
? ? if(COUNTROWS(tb2)=1,tb2,BLANK())
還可以寫(xiě)成:(Ps:其實(shí)本人就習(xí)慣這種寫(xiě)法,原理在上節(jié)課已做了詳細(xì)說(shuō)明)
峰值日期1 =?
? ? var tb1=ADDCOLUMNS(VALUES('日期表'[日期]),"銷(xiāo)售金額",[銷(xiāo)售金額])
? ? var tb2=SELECTCOLUMNS(
? ? ? ? FILTER(tb1,[銷(xiāo)售金額]= MAXX(tb1,[銷(xiāo)售金額])),"日期",'日期表'[日期])
return
? ? if(COUNTROWS(tb2)=1,tb2,BLANK())

網(wǎng)友疑問(wèn):
為什么公式寫(xiě)成下面這樣,就報(bào)錯(cuò)了呢?
鋒值日期2 =?
? ? var tb1=SELECTCOLUMNS('日期表',"日期",'日期表'[日期],"銷(xiāo)售金額",[銷(xiāo)售金額])
? ? var tb2=SELECTCOLUMNS(
? ? ? ? FILTER(tb1,[銷(xiāo)售金額]= MAXX(tb1,[銷(xiāo)售金額])),"日期",'日期表'[日期])
return
? ? if(COUNTROWS(tb2)=1,tb2,BLANK())
網(wǎng)友不理解的地方:
【新建表】表4=SELECTCOLUMNS('日期表',"日期",'日期表'[日期],"銷(xiāo)售金額",[銷(xiāo)售金額])

與使用ADDCOLUMNS時(shí)的結(jié)果一樣呀?我就換了一個(gè)函數(shù),就報(bào)錯(cuò)了?

這里大家要特別注意:雖然二者在顯示結(jié)果上一樣,但是本質(zhì)變了。
ADDCOLUMNS相當(dāng)于整容,例如你長(zhǎng)了兩只眼睛,整容可以讓你變成3只,但你還是你。
SELECTCOLUMNS相當(dāng)于克隆再整容,克隆你再整容成3只眼,長(zhǎng)的一樣,但是那不是你。

總結(jié):出錯(cuò)原因就是你的tb1已經(jīng)不是日期表了,但是它不影響篩選最大銷(xiāo)售金額??墒钱?dāng)你使用Selectcolumns選擇列時(shí),你無(wú)法選擇日期表中的某個(gè)列,因?yàn)槟菑坱b1是克隆表。

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