Страницы: 1
RSS
PowerBI/DAX: Настрока фильтра для каждого слоя отчета в условиях иерархии.
 
Добрый день уважаемые коллеги.

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

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

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

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

Зачем необходим второй фильтр на уровне пунктов продаж? Пунктов продаж в реальном отчете может быть пол тысячи и всех их отбражать на графике в PowerBI согласитесь не разумно и не userfriendly. Визуально, нужно выделить основные пункты продаж по отклонениям так же как и города, но со своим специальным условиям для данного уровня иерархии( отклонение пункта продаж <-2000).

Проблема в том, что при наличии иерархии - Города и далее "Пункты продаж" не понятно как создать два отдельных фильтра или настроить корректно один.
Спасибо Максиму была выведена мера которая позволила корректно отображать фильтрацию для городов. - 'ДанныеBI'[Отклонение] -  
Код
Отклонение = CALCULATE(SUM('ДанныеBI'[Значение]);'Легенд'[Признак отчета]="Отклонение";ALL('Легенд');ALL('ДанныеBI'[ПунктПродаж]))
 Но появилась необходимость так же применять фильтр и для следующего слоя иерархии - Пунктов продаж.

Использовать текущую меру уже для данной задачи не получиться. так как если ее разместить в визуальную часть отчета и установить фильтр, к примеру показать только <=-15000, будет визуально отфильтрованы только Города, Пункты продаж будут показываться все, как именно добавить какой либо индивидуальный визуальный фильтр для Пунктов продаж не могу понять.

Рис1 - необходимое представления слоя отчета для Городов
Рис2 - необходимое представление слоя отчета для Пунктов продаж.
Изменено: bobyjoy - 10.07.2019 22:50:27
 
Может быть поможет функция ISFILTERED(<column_name>)?
Получится что то подобное:
Код
Отклонение (ТОП самых негативных):=VAR porog = IF(ISFILTERED('ДанныеBI'[ПунктПродаж]), -2000, -15000)
VAR delta = CALCULATE(SUM('ДанныеBI'[Значение]);'Легенд'[Признак отчета]="Отклонение";ALL('Легенд');ALL('ДанныеBI'[ПунктПродаж]))
RETURN 
IF(delta<=porog, delta, BLANK())

Код не тестил (реализации PBI у меня нет, только сервер), но думаю логика должна быть такая же...

Еще есть функция ISCROSSFILTERED

А вообще, наверное, интересно должно быть не по абсолютным отсечкам формировать рейтинг, а по количеству - например ТОП 5 самых негативных отклонений...
 
vetrintsev, Спасибо!! создать колонку и меру получилось, но подскажите пожалуйста, куда инкорпорировать данную меру?
Как использовать этот показатель? Если фильтровать по данному отклонению  на слое пунктов продаж отражаются всеравно все пункты.
Изменено: bobyjoy - 11.07.2019 14:52:53
 
Цитата
bobyjoy написал:
Как использовать этот показатель?
К сожалению, не имею практики использования интерфейса Power BI, здесь лучше подскажут другие участники форума.
По идее, мера сама по себе возвращает данные только в том случае - если порог соблюден. В привычном Excel в отчете остануться только строки удовлетворящие порогу.
А значит для всех остальных срезов вернет BLANK() - и измерение должно скрыться с отчета/графика.

Цитата
bobyjoy написал:
создать колонку
Вот здесь не понял, зачем колонка, если это чистая мера?
 
Вот не понятно, как фильтровать, видите значения сразу схлопнулись и просуммировались согласно фильтру.
 
Чуть поменял формулу vetrintsev,
Код
Показатель с отклонением =
VAR __IsPunkt =
    ISINSCOPE ( 'ДанныеBI'[ПунктПродаж] )
VAR porog =
    IF ( __IsPunkt; -2000; -15000 )
VAR delta =
    IF (
        __IsPunkt;
        CALCULATE (
            SUM ( 'ДанныеBI'[Значение] );
            'Легенд'[Признак отчета] = "Отклонение";
            ALL ( 'Легенд' )
        );
        CALCULATE (
            SUM ( 'ДанныеBI'[Значение] );
            'Легенд'[Признак отчета] = "Отклонение";
            ALL ( 'Легенд' );
            ALL ( 'ДанныеBI'[ПунктПродаж] )
        )
    )
RETURN
    IF ( delta <= porog; SUM ( 'ДанныеBI'[Значение] ) )

поместите её вместо поля Значение в области полей графика, а фильтр никакой не нужен, и колонка тем более
F1 творит чудеса
 
Ураааа, работает и я въехал в формулу.

Спасибо огромное Максим Зеленский !!!!!! и  vetrintsev.
Коллеги если есть какие то стандартные способы установки фильтрации для разных уровней иерархии, если не сложно дайте ссылку.
Конкретно данную формулу я понял, но к примеру применять в других ситуация возможно продеться сильно модифицировать. Ну не может же быть, что макрософт не предусмотрел кастомизацию фильтров на разных уровнях иерархии через панели в меню а не на уровне формул.
Изменено: bobyjoy - 11.07.2019 19:27:20
 
Цитата
Максим Зеленский написал: ISINSCOPE ( 'ДанныеBI'[ПунктПродаж] )
не соображу, как отрабатывает это условие для контекста строки?
 
vetrintsev, вот циатата с Дакс.Гайда
Цитата
Returns TRUE if the column is in included in the filter context and it is a grouping column for the current row in the result set
Так понятнее?
Вот горшок пустой, он предмет простой...
 
Коллеги, если будет возможность и время вы можете помочь еще модифицировать формулу для условия что бы можно было как раз так же выбирать TOP или BOTTOM.
К примеру BOTTOM 5 пунктов продаж ил BOTTOM 3 Города (два фильтра одновременно.
Изменено: bobyjoy - 12.07.2019 10:05:39
 
Цитата
vetrintsev написал:
не соображу, как отрабатывает это условие для контекста строки?
если просто в контексте строки ISINSCOPE(столбец), то будет FALSE. Если в контексте строки работает перенос контекста, например, используем CALCULATE(ISINSCOPE(столбец), то будет TRUE.
В общем, в контексте строки бесполезная функция, её используем для визуалов/сводных, чтобы определить, где находимся. По идее, ISINSCOPE мог бы быть шорткатом для сочетания функций типа HASONEVALUE, ISFILTERED, ISCROSSFILTERED, но нет, там идет проверка на другом уровне. Условно говоря, если при помощи фильтров оставить в столбце только одно значение, то в итоговой строке HASONEVALUE даст TRUE, но ISINSCOPE даст FALSE. Скорее всего, проверяется на уровне кода визуала при помощи ISSUBTOTAL
F1 творит чудеса
 
все, я понял :)

Я сначала прочитал:
Цитата
поместите её вместо поля Значение...
И думал, зачем ее в строку вгонять... И только сейчас прочитал:
Цитата
...в области полей графика, а фильтр никакой не нужен, и колонка тем более
Спасибо!
Страницы: 1
Наверх