Фильтрация по вычисляемому столбцу декартового произведения в DAX - PullRequest
1 голос
/ 30 октября 2019

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

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

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

enter image description here

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

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

Таблица выглядит следующим образом: enter image description here

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

Файл PBIX здесь.

Редактировать после комментариев. enter image description here Алексис, это ты о чем? Я добавил столбец P @ R, представляющий собой конкатенацию Product и Region. Вроде работает: -)

1 Ответ

1 голос
/ 30 октября 2019

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

Relationship Diagram

Для этого мойТаблица #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, но вы не можете изменитьвычисляемая таблица в редакторе запросов.

...