Страницы: 1
RSS
PowerBI/DAX: Фильтр таблицы по ТОП 3 или BOTTOM 3 в условия иерархии
 
Добрый день уважаемые коллеги.

Общее описание проблемы:

В ходе настройки отчета в PowerBI возникла необходимость отфильтровать (отобразить) Города только с отрицательным (условием значения "0") отклонением по продажа от плана и далее если провалиться в любой из таких городов, отобразить только Пункты продаж (в каждом городе несколько пунктов продаж) которые имеют отклонение к примеру первых 3 нижних ( самых больших отклонений). То есть отображение ан уровне пунктов продаж самые отрицательные пункты продаж, а на уровне Город показывать просто те города которые имеют отрицательные значения. То же самое и в плюс, необходимо отобразить на другом слайде табличку с перечнем городов Только с положительным отклонением и когда проваливаешься внутрь до пунктов продаж, необходимо отобразить пункты первые 3 с самым большим отклонением по продажам в плюс.

Описание отчета:

В рамках городов есть план по выручке (БП), прогноз (ПРОГНОЗ) и отклонение Прогноза от плана.
В источнике для отчета все показатели разбиты по месячно, в самом PowerBI уже суммируются по году.
На слайде в PowerBI мне необходимо вывести с учетом иерархии Города по отклонению в Минус.
1-ым условием для вывода отклонения должно быть только "отрецательные" города по показателю "отклонение" для графика городов (верхний уровень иерархии)
2-йм условием для вывода отклонения должно быть bottom 3 для графика уже Пунктов продаж (низкий уровень иерархии)

Зачем необходим второй фильтр на уровне пунктов продаж? Пунктов продаж в реальном отчете может быть пол тысячи и всех их отбражать на графике в PowerBI согласитесь не разумно и не userfriendly. Визуально, нужно выделить основные пункты продаж по отклонениям так же как и города, но со своим специальным условиям для данного уровня иерархии( top и bottom).
На форму и в интеренете понял, что для отображения TOP и BOttom необходимо использовать формулу rankx.
Так же благодаря помощи на форме в рамках другой задачи понятно, что необходимо использовать формулу inscope для корректной работы с иерархией.
Попытался прописать формулу, к сожелению не получается ее дописать, не понимаю как работает этот rankx и сложно использовать в сочетании с иерархией. Пожалуйста помогите докрутить.
Код
Отклонение TOP = 
var Check = ISINSCOPE('ДанныеBI'[ПунктПродаж])
var lvl2 = CALCULATE(SUM('ДанныеBI'[Значение]);'ДанныеBI'[Признак отчета]="Отклонение";ALL('ДанныеBI'[Город]))
var lvl1 = CALCULATE(SUM('ДанныеBI'[Значение]);'ДанныеBI'[Признак отчета]="Отклонение";ALL('ДанныеBI'[Признак отчета]);ALL('ДанныеBI'[Город]);ALL('ДанныеBI'[ПунктПродаж]))
var N = 3
Return 
IF(HASONEVALUE('ДанныеBI'[ПунктПродаж];RANKX('ДанныеBI';lvl2;
RANKX(

))))               
Изменено: bobyjoy - 23.07.2019 19:30:07
 
Перезалил исходники
 
оно?
F1 творит чудеса
 
Максим, вчера вечером все проверил вре работает!!!
Удалось тиражировать на реальную задачу!!!  Спасибо большое!!! Решение опишу и выложу из вашего файла сюда чуть позже.
 
учтите только, что итоговые суммы по городам считает только по видимым строкам, так что если вам надо итоги выводить правильные, то там еще возня, но мне уже некогда. Решения по правильным итогам были ранее.
F1 творит чудеса
 
Добрый день.

Попробую описать, что сделал Максим, что бы достичь итогового результата.
Описание на примере BOTTOM 3 отрицательных отклонений пунктов продаж.
На рис 1 изображена итоговая табличка.
- Отклонения отфильтрованы суммарные (Total) По бюджету и Субподряду. Визуально отражены самые 3 больших пункта продаж по отклонению, соответственно пункты продаж находятся в Городах, поэтому отображены только те города, которые имеют пункты продаж с этим отклонением.
На рис 2 изображены фильтры визуальной настройки отображения Пунктов продаж
- Так как у нас присутсвует иерархия, Пункты продаж в Городах, необходимо было создать два фильтра отображения (две меры) одну для уровня "Город" второй для уровня "Пункт продаж". Далее настроить какие из отклонений включать а какие нет.
Для целей упорядовочиния Отклонений или Пунктов продаж по отклонениями, были внедрены ранги (меры для фильтра).
Для каждого уровня свой.
Для Уровня город - "Cityrank-"
Код
cityrank- = 
IF(
    CALCULATE ( [Отклонение]; ALL ( 'ДанныеBI'[ПунктПродаж] ) ) >= 0;
    0;
    RANKX(
        ALL ( 'ДанныеBI'[Город] );
        CALCULATE ( [Отклонение]; ALL ( 'ДанныеBI'[ПунктПродаж] ) );
        ;
        ASC;
        DENSE
    )
)

Для уровня ПунктПродаж - "PointTank-"
Код
pointrank- = 
VAR __Dev = [Отклонение]
RETURN
    IF (
        ISINSCOPE ( 'ДанныеBI'[ПунктПродаж] );
        IF (
            [Отклонение] >= 0;
            0;
            RANKX (
                FILTER ( ALL ( 'ДанныеBI'[ПунктПродаж] ); [Отклонение] < 0 );
                [Отклонение];
                ;
                DESC;
                DENSE
            )
        );
        1
    )

 
Цитата
bobyjoy написал:
VAR __Dev = [Отклонение]
RETURN
это я погорячился, лишнее :) можно удалить
F1 творит чудеса
 
Попробую разобрать формулу Cityrank-
Код
IF(
    CALCULATE ( [Отклонение]; ALL ( 'ДанныеBI'[ПунктПродаж] ) ) >= 0;0
Если показатель отклонение по пунктам продаж больше 0, тогда вернуть 0 (вернуть ранг 0).

Не много не ясно зачем именно оператор ALL? Что бы если мы проваливаемся на уровень пункта продаж или выбираем какой либо пункт продаж, все равно просматривала формула все пункты продаж?
Код
RANKX(        ALL ( 'ДанныеBI'[Город] );
        CALCULATE ( [Отклонение]; ALL ( 'ДанныеBI'[ПунктПродаж] ) );
        ;
        ASC;
        DENSE
    )
Ранжировать Города; по отклонению; возсходящий порядок; уникальные.

Опять же не много не ясно почему всегда ALL.
Изменено: bobyjoy - 01.08.2019 14:55:38
 
Во-первых, когда мы считаем ранг города, мы должны учитывать все пункты продаж.
Во-вторых, это нужно для того, чтобы при проваливании на уровень пункта продаж для него тоже считался cityrank (такой же, как для города). Тогда фильтр по cityrank не будет убирать строки с пунктами продаж. Просто каждое значение в визуале рассчитывается индивидуально и не в курсе, какой там был cityrank для этого города посчитан в другой ячейке.
Визуал фильтруется сразу двумя фильтрами - соответственно он показывает только те строки таблицы, у которых и cityrank правильный, и pointrank тоже.
Выведите меры cityrank и pointrank в ту же таблицу, будет нагляднее

Можно было в итоге, наверное, написать одной мерой, которая проверяла бы, где мы находимся (город или пункт) и далее считала бы некий ранг, из которого мы брали бы 1,2,3
Но мне уже лень было возиться, честно говоря.
F1 творит чудеса
Страницы: 1
Наверх