#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. или вы можете попытаться дублировать свою таблицу с идентификатором продукта и идентификатором транзакции, создать отношение «много ко многим»; затем создайте некоторые вычисления, чтобы получить количество и количество транзакций