DAX-Урок 2. Функция CALCULATE

Первая функция, с которой необходимо начинать изучение DAX является CALCULATE. Данная функция не имеет точного аналога в Excel, однако ее можно сравнить с функциями SUMIFS и COUNTIFS. Если коротко, то данная функция выполняет наложение фильтров на другие расчетные функции, тем самым мы можем отбирать и включать в расчеты только нужные нам данные.

Синтаксис функции CALCULATE()

     =CALCULATE(<статистическое выражение>, <фильтр1>, <фильтр2>, …)

<статистическое выражение>

Выражение, которое должно нам вернуть число как результат вычисления (значение, а не таблицу). По этой причине в этом параметре часто используются статистические функции типа SUM, MIN, MAX, COUNTROWS и т.д.

  1. SUM([НазваниеСтолбца])
  2. SUM([НазваниеСтолбца1])/MAX([НазваниеСтолбца2])
  3. Название другого расчетного поля (меры)

<фильтр1>, <фильтр2> ...

Фильтр определяет диапазон данных над которыми нужно работать. Здесь указываются условия отбора значений. Как результат возвращает таблицу.

  1. [НазваниеСтолбца] = "Авто"
  2. [НазваниеСтолбца]>= 6
  3. ALL('НазваниеТаблицы') или ALL('НазваниеТаблицы'[НазваниеСтолбца])
  4. FILTER('НазваниеТаблицы';'НазваниеТаблицы'[НазваниеСтолбца] = "Зеленый")

Предположим мы имеем следующую таблицу, которая называется Demo и загружена в PowerPivot.

Давайте на ее основе создадим сводную таблицу и подсчитаем количество записей для каждого продукта.

Теперь давайте создадим новое расчетное поле (меру) Count_All_Product в нашей сводной таблице, которое будет отображать общее количество записей напротив всех строк.

Каким образом мы получили в расчетном поле Count_All_Product цифры 16? Объяснение в том, что мы сняли для этого поля все фильтры, которые были применены в сводной таблице (каждая строка в сводной таблице это отдельный фильтр), с помощью функции ALL(). То есть, другими словами, функция ALL(Demo) дает команду снять все фильтры для расчетного поля Count_All_Product, которые применяются к таблице Demo.

Давайте добавим еще одно поле в строки, чтобы видеть какой была продажа каждого товара по городам.

Видим, что цифры в поле Count of Rows меняются, а в расчетном поле Count_All_Product - нет. Все правильно, поскольку для последнего мы сняли все фильтры в формуле. Теперь давайте внесем незначительные изменения в нашу формулу и посмотрим на результат.

=CALCULATE(COUNTROWS(Demo);ALL(Demo[Product]))

Мы изменили аргумент для функции ALL(), заменив Demo на Demo [Product]. Теперь фильтры будут сняты не для всей таблицы Demo, а только для ее столбца Demo[Product].

Таким образом мы видим, что на поле Count of Rows действуют фильтры Product и City, а на расчетное поле Count_All_Product только фильтр City.

Статьи по теме:

  • DAX-Урок 1. Что такое DAX. Основные понятия.
  • DAX-Урок 3. Функция отбора данных FILTER