Функция взаимодействия с пользователем DAX

#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'
)