Я пытаюсь написать рассчитанную DAX меру, которая использует вложенные агрегаты для вычисления на основе пользовательского контекста запроса, и мне трудно понять, как применить контекст запроса к внутренняя агрегация, а также внешняя. Упрощенная структура моих данных таблицы ниже, где каждая продажа запись представляет собой продажу одного виджета на одного пользователя к другому для данной цены продажи:DAX Вложенные агрегированные контексты/фильтры
И некоторые примеры данных :
Ниже приведен расчетный запрос измерения, который в основном пытается рассчитать в среднем, насколько хороша сделка, которую каждый покупатель получает за свои покупки. Он делает это, выполняя следующие расчеты:
1) Внутренний «Рассчитать»: для каждой записи продажи. Рассчитать среднюю цену данный продавец продает свои виджеты для (потенциально фильтруется).
2) Outer 'Calculate': для каждой записи продажи. Рассчитайте среднее значение цены за вычетом суммы, рассчитанной в # 1, в основном предоставляя дифференциал фактических и ожидаемых объемов продаж.
Avg Actual/Expected Differential :=
CALCULATE (
AVERAGEX (
Sale,
Sale[Price]
- CALCULATE (AVERAGEX (Sale, Sale[Price]), ALLEXCEPT (Sale, Sale[Seller]))
)
)
Эта формула работает в стандартном случае, когда не применяются фильтры запросов, кроме фильтров, связанных с пользователем. Например, фактические и ожидаемые продажи Dale:
- Продажа у Ларри за 2 доллара, где средняя продажа Ларри составляет 3,5 доллара. Дифференциал = - $ 1,5
- Продажа от Боба за 5 долларов, где средняя продажа Боба составляет 3 доллара. Дифференциал = $ 2
- Продажа от Джона за 4 доллара, где средняя продажа Джона составляет 4 доллара. Дифференциал = $ 0
Таким образом, средний фактический/ожидаемый дифференциал составляет $ .5/3 = $ .17.
Проблема, с которой я столкнулся, заключается в применении фильтра запросов на поле IsCashSale
и с этим фильтром применимы как к внутренним, так и к внешним функциям Calculate
.
Например, если я хочу, чтобы фильтровать как внутренний и внешний, чтобы включать только продажа записей, которые имеют истинное IsCashSale
значение можно создать соответствующий фильтр в пользовательском интерфейсе и внешний Calculate
функцию фильтруется надлежащим образом, однако, когда внутренний Calculate
он удаляет этот фильтр по IsCashSale
в результате функции AllExcept
, которая удаляет фильтры из всех столбцов, кроме поля Seller
.
Я попытался включая Sale[IsCashSale]
сумму в списке AllExcept
поля, однако из-за текущий контекст строки, это включает в себя только все записи, которые имеют один и то же IsCashSale
значения суммы в качестве текущей записи внутреннего цикла «Рассчитать». Это вызывает сценарий, при котором фильтр не был применен к IsCashSale
, чтобы быть неправильным.
Я считаю, что я могу найти способ передать выбранные значения от внешнего Calculate
к внутреннему? Если я могу это сделать, я могу включить эти значения в качестве фильтров на внутреннем Calculate
. Есть ли способ использовать что-то вроде функций Earlier
или AllSelected
для этого? Или есть другой способ сделать то, что я пытаюсь сделать? Благодаря!
Примечание: Я Мессинг с 'функцией KeepFilters', которая появляется, чтобы получить меня очень близко: ' Среднее Actual/Ожидаемое Дифференциал: = CALCULATE ( \t AVERAGEX (Продажа, \t \t Продажа [Цена] \t \t - \t \t CALCULATE ( \t \t \t AVERAGEX ( \t \t \t \t Продажа, \t \t \t \t Продажа [Цена]), \t \t \t \t ALLEXCEPT (Продажа, Продажа [Продавец]), \t \t \t \t KEEPFILTERS (VALUES (Продажа [IsCashSale])) \t \t) \t) ) ' В этом случае значение, когда я применил' IsCashSale' фильтр является правильным, и 3 из 5 значений являются правильными, когда не применяются ни один фильтр. –
Это все еще не на 100% правильно, но это может быть начало. Может кто-нибудь объяснить, что там происходит? –
Nevermind, кажется, что удаление функции KeepFilters, но оставление вызова «Ценности» приводит к тому же. Ничего особенного в 'KeepFilters' –