Не могу сам справиться. Поиском пользовался, не нашел, как сформулировать тоже пока не очень понимаю.
В таблице Показатели создал меру:
Код
Средний чек:=CALCULATE(AVERAGE('Услуги'[Чек]);'Показатели'[Отключен]=1)
Хочу посчитать средний чек отключенных клиентов. Информация о чеке хранится в таблице "Услуги", которая связана с таблицей "Показатели" связью: Показатели[Услуга]=Услуги[Код]. При этом для одной записи таблицы "Услуги" есть множество связанных записей в таблице "Показатели".
Но если эту меру посчитать, то она возвращает среднее по всем строкам таблицы "Услуги" вне зависимости от контекста, даже фильтр 'Показатели'[Отключен]=1 здесь не работает. Как будто связь вообще не задействована.
Подскажите пожалуйста, как правильно посчитать среднее по значениям в связанной таблице "Услуги" для всех связанных записей с таблицей "Показатели"?
Еще не до конца уловил логику контекста, нашел книгу, которую мне рекомендовал Максим Зеленский "The Definitive Guide to DAX: Business intelligence with Microsoft Excel, SQL Server Analysis Services, and Power BI" - буду учить.
vetrintsev, чтобы понять, что сделал Андрей VG, и как это работает, придется дочитать как минимум до 10 главы включительно Это один из самых сложных аспектов DAX
Максим, я бы так и не сказал. Обычный Inner Join таблицы и подзапроса с фильтром с последующей группировкой и агрегатной функцией, если рассматривать это с точки зрения SQL. Там в DAX других тёмных мест хватает.
Андрей VG написал: Обычный Inner Join таблицы и подзапроса с фильтром с последующей группировкой
Возможно оно внутри так просто и выглядит но я ни как не могу понять как эта функция проворачивает запрос именно с такой логикой ))) я вижу функцию, и не понимаю что она возвращает. Вот что возвращает FILTER ??? Таблицу? Параметры фильтрации? или что то еще? И почему не работает такое же условие без FILTER? Я тут же вспомнил про функцию KEEPFILTERS, которая сработала в другой логике... Но почему???)))))) в общем, читаю...
vetrintsev написал: Вот что возвращает FILTER ??? Таблицу?
Фильтр возвращает таблицу. Ваша проблема в том, что вы воспользовались "ленивой" версией CALCULATE. Собственно, всегда логическое выражение отбора оборачивается в фильтр. Ваша мера в "неленивой" полной версии
Код
Средний чек:=CALCULATE(AVERAGE('Услуги'[Чек]);
FILTER('Услуги'; 'Показатели'[Отключен]=1)
)
Но может ли таблица Показатели фильтровать Услуги, учитывая направление связей? Правильный ответ - нет, в направлении многие ко одному "пропаганды" нет CALCULATE же использует отфильтрованную таблицу по условию для вычисления пересечения с таблицей, используемой в агрегатной функции (тот самый Inner Join). Но по вашему фильтру вы получаете неизменённую таблицу Услуги. Потому и не работает.
Андрей VG написал: Ваша мера в "неленивой" полной версии
в полной версии начальная мера выглядит так:
Код
Средний чек:=CALCULATE(AVERAGE('Услуги'[Чек]); FILTER(ALL('Показатели'[Отключен]); 'Показатели'[Отключен]=1) )
"Обратная пропаганда" против направления связи срабатывает только в случае если мы первым аргументом FILTER запихнем таблицу Показатели целиком. Но на самом деле там не такой механизм, и ни чего против течения не идет. То есть, описать его через inner join можно, но это не то, что происходит под ковром. Если представить, что к Услугам через 1:много привязана еще одна факт-таблица, то можно было бы и так написать:
Опять, же всегда использовал полную таблицу. Так и не осилил Definitive... - времени нет. Но помня, что авторы сначала предлагали для обработки многие ко многим, а потом в этой книге спокойно использовали ограничение по полной таблице... Поэтому
Цитата
Максим Зеленский написал: но это не то, что происходит под ковром
не даёт требуемого пересечения с таблицей Услуги, но не факт, что причина не лежит в той же плоскости, в которой нельзя одно столбцовую виртуальную таблицу использовать в SUM.