Страницы: 1
RSS
Power BI. Две разные меры работают как надо, а при объединении в одну через VAR - нет.
 
Добрый день!

Понял, что есть еще вопросы с общей логикой работы BI. Подскажите, пожалуйста, почему так происходит:
1) Если пишу две меры примерно такого содержания:
Код
Кол-во = 
COUNTROWS (
    FILTER (
        ADDCOLUMNS (
            'Справочник',
            "сумма для фильтра",
            CALCULATE (
                SUM ( '1'[Значения] ),
                ALLEXCEPT (
                    '1',
                    'Календарь'[Year]                 
                )
            )
        ),
        [сумма для фильтра] > 0
    )
)
Код
кол-во_2 = 
IF (
    SELECTEDVALUE ( 'Переключатель'[Переключатель] ) = "1",
    [Кол-во],
    CALCULATE (
        [Кол-во],
        USERELATIONSHIP ( 'Менеджеры'[Значение], 'Справочник'[Менеджер Холдинга] )
    )
)
, то все работает как надо - вторая мера выводит мне нужные данные.
2) Если пытаюсь оптимизировать количество мер и пишу аналогичный код в одной мере, то расчёт идёт некорректный:
Код
Кол-во = 
VAR i1 = 
COUNTROWS (
    FILTER (
        ADDCOLUMNS (
            'Справочник',
            "сумма для фильтра",
            CALCULATE (
                SUM ( '1'[Значения] ),
                ALLEXCEPT (
                    '1',
                    'Календарь'[Year]                 
                )
            )
        ),
        [сумма для фильтра] > 0
    )
)
VAR i2 =
IF (    
    SELECTEDVALUE ( 'Переключатель'[Переключатель] ) = "1",
    i1,
    CALCULATE (
        i1,
        USERELATIONSHIP ( 'Менеджеры'[Значение], 'Справочник'[Менеджер Холдинга] )
    )
)
RETURN i2

Почему так происходит?
Хочу максимально сократить количество неиспользуемых мер и применять USERELATIONSHIP только в начальных мерах, а все остальные расчёты, которые опираются на эти меры уже делать без указания связи (которая, по идее, применилась на первых этапах)
 
Все просто...вернее, не очень просто)). Одно из преимуществ переменной в том, что она рассчитывается один раз (применительно к каждому контексту фильтров: и внешнему, и внутреннему). Если контекст фильтров повторяется, то значение берется из уже рассчитанной переменной, а не считается еще раз. В вашем случае вот здесь
Цитата
Andrey Belkin написал:
CALCULATE (        i1,        USERELATIONSHIP ( 'Менеджеры'[Значение], 'Справочник'[Менеджер Холдинга] )
связь USERELATIONSHIP не срабатывает, потому что значение i1 уже посчитано ранее по активной связи и оно не меняется.
 
добавьте переменную i2 =
Код
VAR i2 = 
COUNTROWS (
    FILTER (
        ADDCOLUMNS (
            'Справочник',
            "сумма для фильтра",
            CALCULATE (
                SUM ( '1'[Значения] ),
                ALLEXCEPT (
                    '1',
                    'Календарь'[Year]                 
                )
            )
        ),
        [сумма для фильтра] > 0
    ),
        USERELATIONSHIP ( 'Менеджеры'[Значение], 'Справочник'[Менеджер Холдинга] )
)

и конечный результат:
Код
VAR rezult =
IF (    
    SELECTEDVALUE ( 'Переключатель'[Переключатель] ) = "1",
    i1,
    i2
)
Изменено: Vladimir Chebykin - 09.03.2022 13:10:05
 
Мда... примерно так и думал. Получается, что или писать одинаковый двойной код, или задваивать меры. Очередной раз спасибо большое, Владимир!
 
Цитата
Andrey Belkin написал:
или писать одинаковый двойной код,
ну может в каких-то случаях код будет длиннее, но преимуществ однозначно больше:
1. На больших и сложных моделях данных экономится время расчета - что архиважно для конечного пользователя.
2. Писать и редактировать (и еще понимать, что понаписал по истечению времени) гораздо проще с переменными, особенно "трехэтажными". Может Вам еще не приходилось, но когда функция состоит из 30-ти строк (субъективно) и более - разница очень сильно чувствуется в удобстве работы.
Вот пример сложной меры из реального кейса (динамический расчет АВС-анализа:
Скрытый текст

Возможно, без переменных код будет короче, но попробуй его разбери - как оно работает. С переменными можно понять логику даже со стороны
Изменено: Vladimir Chebykin - 09.03.2022 13:27:09
Страницы: 1
Наверх