请在文末下载附件
一、背景
今天我来看一下 Power BI 层级排名的几种呈现方式。
老规矩,我们首先看一下效果。
我们分别以 RANKX
和 COUNTROWS
两个函数为核心思路,写了一般业务情况下的 3 种排名方式,共计 6 个度量值。
rank_0
: 上图红色背景区域,矩阵中大区和省份两个层级,大区层级按照所有大区层级排名,省份层级按照所有省份排名。rank_1
: 上图黄色背景区域,矩阵中大区和省份两个层级,大区层级按照所有大区层级排名,省份层级按照省份所在大区内排名。rank_2
: 上图绿色背景区域,矩阵中大区和省份两个层级,所有大区和省份拉通排名。
在你的业务一般使用哪种排名方式呢?
二、模型
示例中使用的维度表有:D00_大区表
、D01_省份表
;事实表有:T05_订单子表
。
表间关系如下:
三、DAX
基础度量值:01_销售金额
01_销售金额 = ROUND( SUM ( 'T05_订单子表'[F_06_产品销售金额] ) / 1e6, 10 )
rank_0_RANKX
: 使用 RANKX
为核心思路,需要注意判断维度是否筛选的使用,让矩阵显示我们需要的内容。
rank_0_RANKX =
VAR TF1 =
ISFILTERED ( 'D00_大区表'[F_02_大区] )
VAR TF2 =
ISFILTERED ( 'D01_省份表'[F_05_省简称2] )
VAR _RANK =
SWITCH (
TRUE (),
TF1 && NOT ( TF2 ), RANKX ( ALL ( 'D00_大区表' ), [01_销售金额], [01_销售金额], DESC ),
TF2, RANKX ( ALL ( 'D01_省份表' ), [01_销售金额], [01_销售金额], DESC )
)
VAR RESULT =
IF ( [01_销售金额], _RANK, BLANK () )
RETURN
RESULT
rank_0_COUNTROWS
: 使用 COUNTROWS
为核心思路。注意 WINDOW
函数的巧妙使用。
rank_0_COUNTROWS =
VAR TF1 =
ISFILTERED ( 'D00_大区表'[F_02_大区] )
VAR TF2 =
ISFILTERED ( 'D01_省份表'[F_05_省简称2] )
VAR matrixD00 =
SUMMARIZE ( ALLSELECTED ( 'D00_大区表' ), 'D00_大区表'[F_02_大区], "@VALUE", [01_销售金额] )
VAR matrixD01 =
SUMMARIZE ( ALLSELECTED ( 'D01_省份表' ), 'D01_省份表'[F_05_省简称2], "@VALUE", [01_销售金额] )
VAR contextD00 =
WINDOW ( 1, ABS, 0, REL, matrixD00, ORDERBY ( [@VALUE], DESC ) )
VAR contextD01 =
WINDOW ( 1, ABS, 0, REL, matrixD01, ORDERBY ( [@VALUE], DESC ) )
VAR _RANK =
SWITCH (
TRUE (),
TF1 && NOT ( TF2 ), COUNTROWS ( contextD00 ),
TF1 && TF2, COUNTROWS ( contextD01 )
)
VAR RESULT =
IF ( [01_销售金额], _RANK, BLANK () )
RETURN
RESULT
四、总结
- 注意基础度量值,我们使用了
ROUND
。为什么要使用取近似值?是因为RANKX
在浮点数排名的时候会发生不可预知的错误。一般情况,不使用浮点数来排名,如果实在需要使用的话,就使用近似值,把精度取到合适的位置即可。 - 使用
ALL
去除筛选的时候,需要把按序排列的字段也要加进来,才能把筛选去掉;具体会在rank_2
体现。
by焦棚子
请点击【立即购买】或者【升级VIP】获得案例附件。
评论