动力bi的动态排名

时间:2018-03-12 05:49:15

标签: dynamic powerbi dax ranking slicers

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

方案如下: 样本数据如下

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

现在,要求始终根据销售情况展示前五大品牌。即,排名前四的品牌和第五个品牌显示为其他品牌。

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

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

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

销售总额

SumSales = SUM(Sheet1[Sales])

等级

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 个答案:

答案 0 :(得分:2)

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

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

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

这里的一个关键想法是,您需要一个单独的表作为切片器使用,否则您在进行选择时将无法看到所有品牌。让我们按如下方式定义一个新表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