Страницы: 1
RSS
DAX. Вопрос по работе функции CALCULATE
 
Доброго времени суток!
Осваивая книгу по DAX, столкнулся со сложность в понимании алгоритма работы функции CALCULATE.
Целиком главу с CALCULATE перечитал раз 8 с интервалом в месяц, свод алгоритма раз 30, но что-то это мне не помогает.
Причем перечитываю целиком главу вроде все понятно, но дохожу до свода в конце главы и понимание рассеивается.
Прошу помощи в разборе алгоритма работы CALCULATE, на примере ячейки D15.
Алгоритм работы CALCULATE прилагаю в ворде. Разрешение на публикацию этого фрагмента из книги от издательства получил.
Во вложении постарался придумать формулу  как с аргументом фильтра, так и с преобразованием контекста.
 
Наверное надо описать свое понимание работы:
П1.

Скрытый текст
тут явные аргументы фильтра это 'Product'[Product]= "A" , а исходный контекст вычисления  это контекст строки и контекст фильтра в отчете который для D15 равен A продукту.
П2
Скрытый текст
тут исходный контекст фильтра это тот что А продукт, который идет из сводной таблицы?
П3.
Скрытый текст

Т.е. исходный контекст фильтра мы скопировали и сейчас преобразуем контекст строки в контекст фильтра чтобы его потом добавить к скопированному контексту фильтра.
Скрытый текст
Тут вроде мы уже оценили и аргументы фильтра на первом шаге, и преобразовали все контексты, непонятно как теперь будет влиять ALL например.

 
Lari, если честно, то я не понял, что вы не поняли))
На самом деле в вашем примере все очень просто. Ваша мера:
Код
Test = 
SUMX ( Sales, CALCULATE ( SUM ( Sales[Quantity] ), 'Product'[Product] = "A" ) )

Для вычисления, которое у вас находится внутри действуют контекст фильтра, который приходит из строки сводной, и контекст строки, который получаете из таблицы Sales, которая является первым аргументом функции SUMX. На таблицу Sales при этом также действует контекст фильтра, который вы никак НЕ меняете, т.к. CALCULATE у вас внутри, а не снаружи. Соответственно для строки в сводной с Product=B мы получаем, отфильтрованную таблицу по этому продукту, после чего говорим, а теперь просуммируй все продукты А, естественно он ничего не находит и возвращает пусто, а в строке итогов находит только продукты А.
По сути ваша внутренняя функция выглядит так:
Код
CALCULATE ( SUM ( Sales[Quantity] ),Sales[Product]="B", 'Product'[Product] = "A" )

Повторюсь: это происходит потому, что для таблицы Sales вы НЕ меняете в своей функции контекст вычисления
Сравните с написанием:
Код
Test = 
CALCULATE(SUMX ( Sales, CALCULATE ( SUM ( Sales[Quantity] ))), 'Product'[Product] = "A" ) 

Или вот так:
Код
Test2 = 
SUMX ( 'Product', CALCULATE ( SUM ( Sales[Quantity] ), 'Product'[Product] = "A" ) )

Различаться будут результаты в строке итогов, т.к. в первом случае мы сначала отфильтровали таблицу Sales по продукту А, а потом сложили.
Во втором случае в строке итогов мы сначала получаем ВСЮ таблицу продуктов, для каждой строки рассчитываем сумму по продукту А, а потом суммируем, поэтому получаем 12.
 
StepanWolkoff, доброго времени суток!
Спасибо за ответ , я еще его осмысливаю)
Страницы: 1
Наверх