Найдите, какой товар часто заказывают вместе с ней в DAX

#powerbi #dax

Вопрос:

У меня есть отчет powerbi, содержащий таблицу, которая выглядит так :

Идентификатор продукта Идентификатор транзакции Кол-во
A X 1
B X 2
C X 1
A Y 2
B Y 1
A Z 1
C Z 1

Я хотел бы создать новую таблицу в dax, которая показывала бы для каждого уникального появления идентификатора продукта в предыдущей таблице, каждый продукт, который был куплен в одно и то же время (=в транзакции), и сумму связанного количества.

Итак, в приведенном выше примере это даст таблицу, подобную :

Идентификатор продукта Идентификатор связанного продукта Кол-во Количество транзакций
A B 3 2
A C 2 2
B A 3 2
B C 1 1
C A 2 2
C B 2 1

Я надеюсь, что это достаточно ясно.

В SQL я, вероятно, мог бы это сделать, но я понятия не имею, как это сделать в DAX (используя таблицу, сгенерированную DAX)

Кто-нибудь может мне помочь ?

Спасибо

Ответ №1:

это может быть немного сложно, и я не знаю, как это работает с большим набором данных. Я использую GENERATE для создания Main и связанного продукта (первый шаг-создание corssjoin!), Затем мы упаковываем MainProd в переменную для создания виртуальной таблицы со всеми идентификаторами транзакций (__Trans). Затем мы можем легко сравнить [AssociatedProd] с исходным кодом продукта и транзакцией с нашим __Trans. В конце концов, я удаляю самоотношение (Продукт А против продукта А).

 AssocAgg = 
FILTER (
    GENERATE (
        SELECTCOLUMNS (
            VALUES ( Associated[Product ID] ),
            "MainProd", Associated[Product ID]
        ),
        VAR __Main = [MainProd]
        VAR __Trans =
            CALCULATETABLE (
                VALUES ( Associated[Transaction ID] ),
                Associated[Product ID] = __Main
            )
        RETURN
            ADDCOLUMNS (
                SELECTCOLUMNS (
                    VALUES ( Associated[Product ID] ),
                    "AssociatedProd", Associated[Product ID]
                ),
                "Trans",
                    CALCULATE (
                        COUNTROWS ( VALUES ( Associated[Transaction ID] ) ),
                        FILTER (
                            Associated,
                            [AssociatedProd] = Associated[Product ID]
                                amp;amp; Associated[Transaction ID] IN __Trans
                        )
                    ),
                "qty",
                    CALCULATE (
                        SUM ( Associated[Qty] ),
                        FILTER (
                            Associated,
                            [AssociatedProd] = Associated[Product ID]
                                amp;amp; Associated[Transaction ID] IN __Trans
                        )
                    )
            )
    ),
    [AssociatedProd] <> [MainProd]
)
 

введите описание изображения здесь

Комментарии:

1. Спасибо вам за ваш ответ. К сожалению, я попробовал это, и после более чем 2 часов вычислений у меня все еще нет результата. В таблице 247000 строк, поэтому я думаю, что именно поэтому

2. Это может зависеть от того, сколько уникальных идентификаторов продукта у вас есть для каждой таблицы, которую мы создаем (с идентификаторами транзакций). Если у вас связана очень широкая таблица, вы можете в фильтре заменить имя таблицы на ВСЕ(идентификатор связанного продукта], Связанный[Идентификатор транзакции]). Однако может оказаться, что это придется делать в исходной базе данных, например, с помощью sql-запроса.

3. или вы можете попытаться дублировать свою таблицу с идентификатором продукта и идентификатором транзакции, создать отношение «много ко многим»; затем создайте некоторые вычисления, чтобы получить количество и количество транзакций