Мы построили «звезду»: факт Продажи и справочники Товары, Регионы, Календарь, связанные «один ко многим». Связи нужны не только для фильтрации в отчёте — по ним можно ходить прямо в формуле. Для этого две функции: RELATED и RELATEDTABLE.
RELATED — тянем значение со стороны «один»
В таблице Продажи нет цены — она в справочнике Товары. Чтобы в строке продажи получить цену её товара, идём по связи функцией RELATED:
Выручка (из количества и цены) =
SUMX ( Продажи, Продажи[Количество] * RELATED ( Товары[Цена] ) )
Итератор стоит на строке продаж; RELATED(Товары[Цена]) переходит по связи к нужному товару и возвращает его цену. Так в факт «подтягивается» любой атрибут из справочника: бренд, категория, единица измерения.
RELATED работает со стороны «многих» к стороне «один»: из строки Продажи (многих) к одной строке Товары (один). Это естественно — у каждой продажи ровно один товар, поэтому и значение одно.
RELATEDTABLE — собираем строки со стороны «многих»
Обратная задача: стоя на товаре (сторона «один»), получить все его продажи (сторона «многих»). Это RELATEDTABLE — он возвращает связанную таблицу, по которой можно считать:
Сколько раз продавался товар =
COUNTROWS ( RELATEDTABLE ( Продажи ) )
Положите эту меру в таблицу по товарам — у каждого увидите число его продаж. RELATEDTABLE вернул для каждого товара его строки в Продажи, а COUNTROWS их посчитал.
Выручка по товару =
SUMX ( RELATEDTABLE ( Продажи ), Продажи[Сумма] )
RELATED возвращает одно значение (идём к «один»). RELATEDTABLE возвращает таблицу строк (идём к «многим»). Какую брать — зависит от того, с какой стороны связи вы стоите.
Когда они нужны, а когда нет
Чаще всего ходить по связям в формуле не требуется — обычная мера SUM(Продажи[Сумма]) сама уважает связи: поставили «Категория» из Товары в строки, и выручка разложилась по категориям без всякого RELATED. Связи работают «фоном».
RELATED/RELATEDTABLE нужны точечно: когда расчёт идёт построчно (внутри итератора) и в строке не хватает атрибута из соседней таблицы.
Если выручка и так раскладывается по категории через обычную меру — не переписывайте её на RELATED. Эти функции — для построчных расчётов, а не замена нормальной фильтрации по «звезде».
Что дальше
Мы умеем считать, менять контекст, фильтровать и ходить по связям. Осталась самая «управленческая» группа — время: прошлый год, нарастающий итог с начала года, скользящее среднее. Следующий урок — time intelligence.