Power BI, почему обнаружена циклическая зависимость

Не могли бы вы объяснить, почему я сталкиваюсь с этим предупреждающим сообщением о циклической зависимости, когда пытаюсь создать связь между измерением #product (или #region) и таблицей #bridge, которая является декартовой областью продукта x?

Я связал #bridge с продажами и бюджетом с помощью одного столбца P @ G, который представляет собой конкатенацию продукта и региона.

Загрузите файл здесь: PBIX

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


person Przemyslaw Remin    schedule 31.10.2019    source источник


Ответы (2)


Быстрое и грязное решение - создать новые версии #product и #region с помощью VALUES. Наверное, это не лучший способ сделать это ...

NewProduct = VALUES('#product'[product])

Эти новые таблицы могут быть связаны с #bridge отношением 1: * и, таким образом, могут использоваться в качестве среза на панели управления.

Альберто написал об этом в блоге sqlbi: блог о циклической зависимости sqlbi

person OscarLar    schedule 01.11.2019
comment
Спасибо, ОскарЛар. Мне удалось избежать грязных решений. Я хотел бы добавить ссылку на другую статью Альберто Феррари, которую я опубликовал в своем ответе. - person Przemyslaw Remin; 02.11.2019
comment
Как-то я упустил возможность оценить ваш ответ голосованием за. Спасибо за подсказку. - person Przemyslaw Remin; 20.12.2019
comment
Ура, не уверен, стоило ли голосовать за него, учитывая мрачный характер решения ... но спасибо :) - person OscarLar; 20.12.2019

Решение простое. Не используйте функцию CALCULATE в таблицах моста DAX. Вместо этого добавьте все эти столбцы в ту же таблицу позже, что и вычисляемые столбцы.

Я изменил исходный код таблицы мостов:

ADDCOLUMNS (
    CROSSJOIN ( '#product', '#region' ),
    "P@R", COMBINEVALUES("@",'#product'[product], '#region'[region]),
    "sales", CALCULATE ( SUM ( Budget[target] ) ),
    "IsSale", IF ( CALCULATE ( SUM ( Budget[target] ) ) > 0, "Yes", "No" )
)

К чему-нибудь попроще:

ADDCOLUMNS (
    CROSSJOIN ( '#prodact', '#region' ),
    "P@R", COMBINEVALUES("@",'#prodact'[product], '#region'[region])
)

Я изменил код DAX таблицы моста, чтобы оставить только столбцы, необходимые для объединений. Столбцы, которые мне нужно было вычислить, я добавил как вычисляемые столбцы. Вот и все. Я обнаружил это случайно, экспериментируя с ним.

Для игры со столами для бриджа я рекомендую эту статью Альберто Феррари: https://www.sqlbi.com/articles/avoiding-circular-dependency-errors-in-dax/. Это вдохновило меня на решение проблемы. Из текста Альберто я понял, что функции VALUES и ALL не подходят для таблиц мостов. Он упоминает о проблеме использования функции CALCULATE внутри таблиц DAX моста. Функция каким-то образом переводится как смесь функций ВСЕ и ФИЛЬТР. Вместо VALUE и ALL используйте функции DINSTINCT и ALLNOBLANKROW.

Рабочий файл PBIX. Ура!

person Przemyslaw Remin    schedule 01.11.2019