之前呢,白茶曾經(jīng)分享過關(guān)于RANKX排名問題,但是在實際需求中,有時候我既想展示排名,但是同時我又想看看銷售前幾,該如何進行呢?這個問題就是標(biāo)題——TOPN的問題。
上圖,是白茶準備的示例文件,之前幾期經(jīng)常使用的一份銷售情況。利用SUMX函數(shù)+RELATED函數(shù)進行匯總,求出銷售金額,輸入如下代碼:
銷售金額 =
SUMX ( '銷售明細', '銷售明細'[銷售數(shù)量] * RELATED ( '產(chǎn)品表'[銷售價] ) )
結(jié)果如圖:
金額匯總完畢,接下來我們繼續(xù)編寫排名代碼如下:
絕對排名 =
IF ( HASONEVALUE ( '產(chǎn)品表'[商品名稱] ), RANKX ( ALL ( '產(chǎn)品表' ), [銷售金額] ) )
結(jié)果如下:
這時候我們發(fā)現(xiàn)了,好像排名這里,似乎有點不對勁?。扛揪褪清e的??!之前在RANKX那一期結(jié)尾的時候,白茶曾經(jīng)說過,可以多維度排名,但是當(dāng)時的前提是同一個表,可以使用ALL('表'[維度1],'表'[維度2]...)這種模式,但是這種不是一個表的維度該如何處理呢?別著急,跟著我的思路走。
這里就延伸出一個概念了,兩個表,我要兩個表的條件列相互匹配,最后形成一個交集,這個概念是不是聽起來很耳熟?沒錯,就是我們了解的笛卡爾積!
在PowerBI中,有DAX函數(shù)可以達到這種效果。
一、GENERATE函數(shù)
GENERATE函數(shù)語法如下:
DAX=
GENERATE ('表A','表B')
結(jié)果返回兩個表的叉積。它的參數(shù)只能是兩個表。
二、CROSSJOIN函數(shù)
CROSSJOIN函數(shù)語法如下:
DAX=
CROSSJOIN ('表A','表B'...)
結(jié)果是返回指定表的叉積。它可以有多個表參數(shù)。
當(dāng)然,在這里只有兩個表維度的情況下使用效果是一致的。
代碼1:
優(yōu)化絕對排名1 =
IF (
HASONEVALUE ( '產(chǎn)品表'[商品名稱] ),
RANKX ( GENERATE ( ALL ( '產(chǎn)品表' ), ALL ( '分店表' ) ), [銷售金額] )
)
代碼2:
優(yōu)化絕對排名2 =
IF (
HASONEVALUE ( '產(chǎn)品表'[商品名稱] ),
RANKX ( CROSSJOIN ( ALL ( '產(chǎn)品表' ), ALL ( '分店表' ) ), [銷售金額] )
)
將兩個代碼在數(shù)據(jù)中對比如下:
可以看得出來結(jié)果是一致的!這就說明兩種方法在這里都是適用的。
排名問題解決了,那么該繼續(xù)研究TOPN的問題了。
編寫如下代碼(這里用優(yōu)化代碼1舉例):
銷售前五 =
IF (
HASONEVALUE ( '分店表'[分店名] ),
CALCULATE ( [銷售金額], FILTER ( VALUES ( '產(chǎn)品表' ), [優(yōu)化絕對排名1] <= 5 ) )
)
結(jié)果如下:
結(jié)果展示沒有任何問題。
那我要是想要靈活的變動成TOPN咋弄?
繼續(xù),添加參數(shù):
修改上面的代碼:
銷售前N =
IF (
HASONEVALUE ( '分店表'[分店名] ),
CALCULATE (
[銷售金額],
FILTER ( VALUES ( '產(chǎn)品表' ), [優(yōu)化絕對排名1] <= SELECTEDVALUE ( 'TOPN索引'[TOPN索引] ) )
)
)
添加一個切片器,結(jié)果如圖:
這樣就可以隨著切片器的變動,隨意調(diào)整我們想要的TOPN了。
傳送門丨:
PowerBI中的排名問題丨RANKX函數(shù)(修訂)
小伙伴們?GET了么?
白茶會不定期的分享一些函數(shù)卡片
(文件在知識星球[PowerBI丨需求圈])
這里是白茶,一個PowerBI的初學(xué)者。
