Фильтрация по вычисляемому столбцу декартова произведения в DAX

Мне нужен срез, чтобы отмечать только те продукты и регионы, для которых заданы цели. введите здесь описание изображения

Моя модель данных немного сложнее, чем я показываю здесь. В моем реальном сценарии таблица «Бюджет» не существует, и целевые значения должны быть рассчитаны из других таблиц с различной степенью детализации. Предположим, мы не можем использовать вычисляемый столбец в таблице бюджета.

Зеленые таблицы - это мосты «один столбец - все значения - измерение». Красная таблица - это декартово произведение продуктов и брендов с рассчитанной целью.

введите здесь описание изображения

Вот код DAX для красной таблицы, которую я приготовил для решения проблемы.

#Brand x Region =
ADDCOLUMNS (
    CROSSJOIN ( '#product', '#region' ),
    "Target", CALCULATE ( SUM ( Budget[target] ) ),
    "IsTarget", IF ( CALCULATE ( SUM ( Budget[target] ) ) > 0, "Yes", "No" )
)

В таблице показано следующее:  введите описание изображения здесь

Но такой хитроумно полученный столбец IsTarget никак не влияет на мои визуальные эффекты через слайсер. Как это исправить.

Файл PBIX здесь.

Редактировать после комментариев. введите здесь описание изображения Алексис, вы это имеете в виду? Я добавил столбец P @ R, который представляет собой соединение продукта и региона. Вроде работает :-)


person Przemyslaw Remin    schedule 30.10.2019    source источник
comment
Возможно ли в вашем реальном сценарии создать один столбец индекса продукта и региона для создания отношения вместо того, чтобы требовать отношения для каждого?   -  person Alexis Olson    schedule 30.10.2019
comment
Таким образом, вы предлагаете декартову модель продукта x бренда в качестве моста вместо одного продукта и одного бренда. Но как связать такую ​​декартову таблицу с FactTable или другими таблицами, если разрешено только одно отношение столбцов?   -  person Przemyslaw Remin    schedule 30.10.2019
comment
Вам нужно будет добавить этот индекс в таблицы, для которых вы хотите установить связь. Вот почему я спрашивал, возможно ли это в вашем случае. Это, безусловно, можно сделать в вашем примере, но это противоречит заявленному вами предположению о Budget.   -  person Alexis Olson    schedule 30.10.2019
comment
Спасибо. Можете ли вы взглянуть на подход, который я предложил в своем ответе после ваших комментариев?   -  person Przemyslaw Remin    schedule 30.10.2019
comment
Это очень похоже на концепцию, и конкатенация - хороший ярлык вместо создания целочисленного индекса. Если вы скрываете таблицы регионов и продуктов, чтобы избежать путаницы (вместо этого используйте перекрестную таблицу), это достойное решение.   -  person Alexis Olson    schedule 30.10.2019


Ответы (1)


Это то, что я предлагал, где нижние отношения находятся в Index столбцах.

Диаграмма отношений

Для этого моя #Brand x Region таблица была такой:

#Brand x Region = 
VAR CrossProduct =
    ADDCOLUMNS (
        CROSSJOIN ( '#product', '#region' ),
        "Target",
        CALCULATE (
            SUM ( Budget[target] ),
            FILTER (
                Budget,
                Budget[product] = EARLIER ( '#product'[product] ) &&
                Budget[region] = EARLIER ( '#region'[region] )
            )
        )
    )
RETURN
    ADDCOLUMNS(
        CrossProduct,
        "IsTarget", IF ( [Target] > 0, "Yes", "No" ),
        "Index", RANKX(CrossProduct, '#product'[product] & '#region'[region])
    )

(Примечание: фильтрация должна быть явной, поскольку я не использую отношения, которые у вас были изначально.)

Оттуда я переместил индекс на FactTableSales и Budget с поиском:

Index =
LOOKUPVALUE (
    '#Brand x Region'[Index],
    '#Brand x Region'[product], [product],
    '#Brand x Region'[region], [region]
)

Обратите внимание, что создать столбец индекса часто проще в редакторе запросов, чем пытаться сделать это в DAX, но вы не можете изменить вычисляемую таблицу в редакторе запросов.

person Alexis Olson    schedule 30.10.2019
comment
Спасибо за это. На вкус тяжелый. Не знал, что это будет так сложно. - person Przemyslaw Remin; 30.10.2019