Динамическое ранжирование в силе би
У меня есть требование, в котором мне нужно получить 5 лучших брендов, основанных на долях продаж в графике.
Сценарий выглядит следующим образом: Пример данных, как показано ниже
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
Теперь требуется всегда показывать топ-5 брендов по продажам. т. е. топ-4 брендов и 5-й бренд представлены как другие, объединяющие все остальные бренды.
Когда пользователь выбирает какую-либо марку из среза (одиночный выбор), этот конкретный бренд должен быть ранжирован - 1-й и, как обычно, следующие 3 лучших бренда, а последний - "Другие", объединяющий остальные.
Мне удалось получить 4 лучших бренда и другие. Но, застрял в получении динамического рейтинга на основе выбора слайсера.
Пожалуйста, ознакомьтесь с нижеприведенными мерами, которые я создал:
Сумма продаж
SumSales = SUM(Sheet1[Sales])
Ранг
Rank = RANKX(ALL(Sheet1[Brand ]),[SumSales])
Топ-5
Top5 = IF ([Rank] <= 4,[SumSales],
IF(HASONEVALUE(Sheet1[Brand ]),
IF(VALUES(Sheet1[Brand ]) = "Others",
SUMX ( FILTER ( ALL ( Sheet1[Brand ] ), [Rank] > 4 ), [SumSales] )
)
)
)
1 ответ
Это сложнее, чем я ожидал, но все же возможно.
Во-первых, давайте создадим вычисляемый столбец, который ранжирует бренды, которые будут использоваться позже.
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())))
Затем вы можете использовать эту меру в матрицах и кольцевых диаграммах.