Порядок операций при работе с Relationships
Статья подготовлена в рамках сериала «Залетай в BI»
В прошлом спринте Руслан делал дашборд в котором столкнулся с интересным поведением Табло
Предположим, что у нас есть таблица с заказами с суммой продаж, и таблица с товарами, которые входят в этот заказ.
Так как в одном заказе может быть несколько позиций, то для соединения этих таблиц логично использовать Relationships (далее рилейшены или макароны :-P).
Предположим, что мы хотим посчитать продажи по производителю«PA». Простой способ — добавить поле Producer в фильтры и выбрать нужного производителя:
Всё работает, как мы ожидаем и показывается верное число — 550 рублей. Но что, если мы хотели бы посчитать продажи не через фильтр, а через отдельное расчетное поле вида IIF([Producer]=«PA»,[Total Sales],NULL)?
Например, такое могло бы пригодиться, чтобы была возможность выбирать производителя через использование параметра и нам нужно было сравнивать параметр с значением поля Producer. В этом случае мы получаем ошибку задвоения по количеству товаров в заказе:
Чтобы раскопать эту ошибку в реальном дашборде у меня ушло больше часа. Наверное ещё мало работаю с этим типом соединений и не набил себе шишек. Но, к сожалению, не нашёл в интернете подробного описания как технически работают рилейшены.
Объясняю себе это так — в первом случае с использованием фильтров Табло сначала выбирает уникальные значения из правой таблицы, затем делает джоин с левой таблицей и только после этого делает расчет суммы для продаж. Во втором же случае мы не фильтруем правую таблицу, а используем её полностью, затем джоиним на левую таблицу и получаем задвоение, затем считаем сумму продаж.
Какой-то порядок операций в квадрате =) Было бы круто найти технический алгоритм работы этих макарон. Кажется, что можно наделать незаметных ошибок, которые приведут к неверному результату. Будьте осторожны!