首页 文章

动力bi的动态排名

提问于
浏览
2

我有一个要求,我需要根据图表中的销售额来获得前五大品牌 .

方案如下:样本数据如下

Brand  Sales
-----------
H      3500
B      2500
I      2200
A      1500
J      1400
K      900
E      800
F      700
L      650
D      600
C      500
N      200
M      150
G      100
Others null

现在,要求是始终根据销售情况展示前五大品牌 . 即,排名前4位的品牌和第5个品牌,其他品牌汇总所有其他品牌 .

当用户从切片机中选择任何品牌(单一选择)时,该特定品牌应该排名 - 第一和往常是下一个前3个品牌,最后一个是'其他'对其余品牌进行分组 .

我成功获得了前四大品牌和其他品牌 . 但是,坚持根据切片器选择获得动态排名 .

请参阅我创建的以下措施:

Sum of Sales

SumSales = SUM(Sheet1[Sales])

Rank

Rank = RANKX(ALL(Sheet1[Brand ]),[SumSales])

Top5

Top5 = IF ([Rank] <= 4,[SumSales],
  IF(HASONEVALUE(Sheet1[Brand ]),
    IF(VALUES(Sheet1[Brand ]) = "Others",
       SUMX ( FILTER ( ALL ( Sheet1[Brand ] ), [Rank] > 4 ), [SumSales] )
    )
  )
)

enter image description here

1 回答

  • 2

    这比我预想的要复杂,但仍有可能 .


    首先,让我们创建一个计算列,对以后要使用的品牌进行排名 .

    Rank = RANKX(ALL(Sheet1), Sheet1[Sales])
    

    这里的一个关键想法是你需要一个单独的表作为切片器使用,否则你赢得't be able to see all the brands when you make a selection. Let'定义一个新表 Brands ,如下所示:

    Brands = SUMMARIZECOLUMNS(Sheet1[Brand ], Sheet1[Rank])
    

    我们将此表用于切片器 .

    接下来,我们创建一个相当复杂的度量来合并我们需要的所有逻辑:

    Top5 = 
        VAR BrandRank = SELECTEDVALUE(Brands[Rank])
        RETURN IF(MAX(Sheet1[Brand ]) = "Others",
                   CALCULATE(SUM(Sheet1[Sales]), ALL(Sheet1)) -
                   CALCULATE(SUM(Sheet1[Sales]), ALL(Sheet1),
                       Sheet1[Rank] >= BrandRank, Sheet1[Rank] < BrandRank + 5),
                    IF(COUNTROWS(ALLSELECTED(Brands[Brand ])) = 1,
                        IF(MAX(Sheet1[Rank]) >= BrandRank &&
                           MAX(Sheet1[Rank]) < BrandRank + 5,
                               SUM(Sheet1[Sales]),
                               BLANK()),
                        IF(MAX(Sheet1[Rank]) <= 5,
                               SUM(Sheet1[Sales]),
                               BLANK())))
    

    然后,您可以在矩阵和圆环图中使用此度量 .

    enter image description here

相关问题