Почему моя функция SUMX DAX возвращает этот результат? - PullRequest
0 голосов
/ 13 марта 2020

Предположим, у меня есть 2 таблицы:

fTransactions

ProdID  RepID  Revenue
1       1      10
1       1      10
1       2      10

dSalesReps

RepID   RepName
1       joe
2       sue

С dSalesReps, имеющими следующие меры без применения фильтров:

RepSales: = CALCULATE (SUM (fTransactions [Доход])) RepSales2: = SUMX (fTransactions, CALCULATE (SUM (fTransactions [Доход])) *

Первая мера выполняет, как я думаю, это происходит. Она переходит в таблицу fTransactions и суммирует столбец Доход.

Вторая мера, после многих проб и ошибок, чтобы выяснить это, похоже, сортирует себя по уникальным строкам в fTransactions.В приведенном выше примере fTransactions имеет 2 строки, где все идентично, а затем последний строка, где что-то отличается. Это, кажется, приводит к следующему: (10 + 10) первая итерация, суммирующая первую «группировку» + (10 + 10) вторая итерация, которая снова суммирует первую «группировку» + (10) последняя итерация, суммирующая вторую «группировку» = 20 + 20 + 10 = 50 По крайней мере, так выглядит работа. Я просто не понимаю почему. Я думал, что это будет go в таблице fTransactions, суммировать все доходы за каждую итерацию, а затем суммировать эти суммы в качестве последнего шага.

1 Ответ

1 голос
/ 13 марта 2020

Это вызвано тем, что называется «контекст-переход» (см. sqlbi более подробное объяснение).

На практике ваша формула «RepSales» использует «Контекст строки» (создан по SUMX), который превращается в эквивалентный «Фильтр контекста» (по CALCULATE), но, поскольку у вас нет уникального ключа в таблице, он получает и использует несколько строк в каждой итерации, ниже объяснения.

Для первой строки контекст строки имеет ProdID = 1 И RepID = 1, что превращается в эквивалентный контекст фильтра (остается неизменным, в данном случае) равен ProdID = 1 AND RepID = 1 , но контекст фильтра является глобальным, и две строки (первые 2) соответствуют этому фильтру. Это повторяется для каждой строки.

этого не происходит с формулой "RepSales", потому что она не повторяется несколько раз (как вы уже заметили)

Это ваша текущая ситуация:

enter image description here

Чтобы доказать это, просто добавьте rowID в таблицу транзакций: enter image description here

Это не это происходит потому, что эквивалентный контекст фильтра также включает столбец RowID, который соответствует только одной строке

Надеюсь, это поможет, используйте статью sqlbi в качестве справки, это будет исчерпывающее руководство, чтобы понять это

...