Почему формула DAX в моем вычисляемом столбце использует распространение для фильтрации в одном случае, а не в другом? - PullRequest
1 голос
/ 15 марта 2020

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

fTransactions

 Index   ProdID  RepID  Revenue
   1        1       1      10
   2        1       1      20
   3        2       2      30
   4        2       2      10

dSalesReps

RepID   RepName   CC1   CCC2   
1       joe       40    70
2       sue       30    70
3       bob             70

CC1 содержит вычисляемый столбец с: РАССЧИТАЙТЕ (SUM (fTransactions [Доход])) Насколько я понимаю, он берет контекст строки и переключается на контекст фильтра, чтобы отфильтровать таблицу fTransaction до RepID и суммировать. Имеет смысл в статье sqlbi на эту тему:

", поскольку контекст фильтра, содержащий текущий продукт, автоматически распространяется на продажи из-за взаимосвязи между двумя таблицами"

CC2 содержит вычисляемый столбец с: SUMX (fTransactions, CALCULATE (SUM (fTransactions [Доход])) * Тем не менее, он помещает одно и то же значение во все столбцы и, по-видимому, не передает RepID, как в другом примере. В той же статье sqlbi упоминается, что фильтр создается для всей строки fTransactions. У меня вопрос, почему он делает это здесь, а не в другом примере, и что случилось с распространением RepID?

"CALCULATE помещает фильтр на все столбцы таблицы, чтобы определить один ряд, а не номер его строки "

1 Ответ

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

В al oop создается вычисляемый столбец: мощность поворачивается строка за строкой и вычисляет результаты. CALCULATE преобразует каждую строку в контекст фильтра (контекстный переход).

Однако во второй формуле у вас есть 2 цикла, а не один: во-первых, это цикл таблицы dSalesReps (потому что именно здесь вы создаете столбец); Во-вторых, он зацикливает таблицу fTransactions, потому что вы используете функцию SUMX, которая является итератором.

Функция CALCULATE используется только во втором l oop, вызывая переход контекста для каждой строки в таблице fTransactions. Но нет CALCULATE, который мог бы вызвать переход контекста для строк в dSalesReps. Следовательно, фильтрация по продажам не выполняется.

Устранить проблему легко: просто оберните вторую формулу в CALCULATE. Еще лучше, отбросьте второй CALCULATE - это не нужно и делает формулу медленной:

CCC2 =
CALCULATE(
    SUMX(fTransactions, SUM(fTransactions[Revenue]))
)

Эта формула практически идентична первой (первая формула на заднем плане переводится как вторая, функция SUM) это просто синтаксический сахар для SUMX).

...