#powerbi #relationship #dax #powerpivot
#powerbi #взаимосвязь #dax #powerpivot
Вопрос:
У меня возникла эта проблема с функцией связи пользователя в DAX. У меня есть две таблицы SalesFact и DimPromoSkus, подобные этой:
Просмотр диаграммы.
Две таблицы в представлении данных выглядят следующим образом:
Просмотр данных
Две таблицы связаны из SkuCampaign1, SkuCampaign2, SkuCampaign3 в факте продажи с SkuCampaign из DimPromoSkus.
Таким образом, в основном цель таблицы DimPromoSkus — указать, был ли продукт в кампании C1, C2 или C3. Например, кампания C1 проводилась в период с 1/1/2019 по 4/1/2019, но в рамках акции были проданы только артикулы A1 и A2. A2 и A3 не были промо-акциями, но продавались в период кампании C1.
Моя цель — рассчитать увеличенные продажи в каждой кампании C1, C2 и C3. Конечно, это можно было бы сделать с помощью lookupcolumn, а затем вычислить продажи, в которых был найден этот ключ, но я хотел бы использовать функцию связи пользователя.
Итак, для расчета промо-продаж для кампании C1 мой показатель теоретически должен быть:
PromoSalesC1:=CALCULATE(SUM(SalesFact[Sales]);USERELATIONSHIP(SalesFact[SkuCampaign1];DimPromoSkus[SkuCampaign]))
Полученный результат должен быть равен 25, но возвращает мне 155, что является общей суммой строк, поэтому на самом деле ничего не делает
Результат продолжает выдавать 155, если я использую SkuCampaign2 или SkuCampaign3, которые являются неактивными отношениями, но СВЯЗЬ ПОЛЬЗОВАТЕЛЯ должна активировать это..
Есть идеи о том, что происходит, или я что-то упускаю? 🙂 Спасибо
Ответ №1:
@StelioK прав в том, что вам нужен способ, чтобы мера применяла контекст фильтра к сумме. Однако вам не нужно явно указывать значение. Вы можете просто передать DimPromoSkus
таблицу в качестве контекста фильтра.
PromoSalesC1 =
CALCULATE(
SUM(SalesFact[Sales]),
DimPromoSkus,
USERELATIONSHIP(SalesFact[SkuCampaign1], DimPromoSkus[SkuCampaign])
)
Помните, что CALCULATE
функция может принимать таблицы в качестве аргументов фильтра. Здесь мы предоставляем DimPromoSkus
в качестве фильтра, чтобы не суммировать какие-либо значения, которые не проходят через указанную взаимосвязь. Так, например, поскольку ее A3 C1
нет в DimPromoSkus
, соответствующая строка в SalesFact
не включается в сумму.
Комментарии:
1. Интересно! Спасибо, Алексис! Приведут ли они к тем же результатам?
2. В данном случае, я думаю, да, но для более общих сценариев, где у вас было, например, несколько кодов, связанных с
Campaign1
(напримерC10
,C11
,C12
), вы не смогли бы просто указать один и получить тот же результат.
Ответ №2:
DAX выполняет именно то, для чего он предназначен. Вызывая функцию связи пользователя, вы «активируете» связь, но вам все равно нужно предоставить контекст фильтра либо через срез, либо в самом DAX.
Используйте приведенный ниже код и посмотрите, поможет ли это
PromoSalesC1 :=
CALCULATE (
SUM ( SalesFact[Sales] ),
USERELATIONSHIP ( SalesFact[SkuCampaign1], DimPromoSkus[SkuCampaign] ),
DimPromoSkus[Campaign] = 'C1'
)