Блок "Функция CALCULATE". В данном блоке мы познакомимся с одной из самых важных функций в языке DAX — функцией CALCULATE, которая позволяет в прямом смысле слова управлять вашими вычислениями, а именно условиями фильтров. Для того чтобы познакомиться и попробовать создать несколько примеров функции CALCULATE, нам необходимо открыть новый отчет Power BI и загрузить пример данных от компании Microsoft. Для этого нажимаем соответствующую кнопку, в окне Навигатора ставим галочку напротив "Sheet1" и нажимаем кнопку "Загрузить". После того как данные были загружены, мы можем приступить к работе. Итак, функция CALCULATE позволяет вам в прямом смысле слова управлять вашими вычислениями. В предыдущих блоках курса мы разобрали, что при расчете значений фильтры очень важны; но что делать, когда вам необходимо на уровне меры добавить какой-то фильтр? Допустим, вы хотите считать сумму скидок только по одному продукту всегда, независимо от того, что было выбрано или не выбрано пользователем при просмотре отчета. Для этого вам потребуется функция CALCULATE. Итак, для того чтобы реализовать наш пример, я создам меру и назову ее "Сумма скидки" с очень простой формулой: сумма по колонке "Discounts" — именно это значение мы и будем рассчитывать. Но, как я уже говорил, мы хотим рассчитывать это значение для конкретного продукта, и первая мера является базовой, или вспомогательной. Для того чтобы создать меру, которая будет считать сумму скидки по продукту, мне необходимо заново кликнуть кнопку "Создать меру", назвать ее. Я хочу рассчитывать сумму скидки для продукта "Velo", поэтому даю именно такое название. Для удобства отображения я буду писать свою формулу на разных строках. Для того чтобы перейти на новую строку в окне формул, необходимо зажать кнопку "Shift" и нажать кнопку "Enter", после чего курсор перейдет на следующую строку. Обратите внимание, что у нас есть подписи с номерами строк, что также помогает нам создавать формулы и отслеживать их корректность. Итак, настало время применить нашу функцию, которая называется CALCULATE. Для этого я начинаю вводить ее название, и подсказка отображает доступные варианты. В окне подсказки я выбираю необходимый мне вариант — это функция CALCULATE. И также, пожалуйста, обратите внимание, что справа у нас есть описание того, что выполняет эта функция; здесь мы видим, что функция "Вычисляет выражение в контексте, измененном фильтрами". Звучит немножко витиевато, но сейчас мы разберем все на практике и поймем, что же это значит. Итак, я нажимаю кнопку "Табуляция", после чего функция была вставлена в окно формулы. Далее для удобства я перейду на новую строку. Для этого снова нажимаю "Shift" и "Enter" — это делать необязательно, но такой метод внесения формул помогает более структурированно на них смотреть и на ранних стадиях выявлять какие-то допущенные ошибки или опечатки. Итак, теперь в окне подсказки мы видим, что жирным шрифтом выделено слово "Выражение" — именно такой аргумент ожидает от нас функция CALCULATE первым. Под выражением понимается та операция, которую необходимо выполнить. В нашем случае нам необходимо выполнить расчет суммы скидки, поэтому здесь я просто укажу ссылку на свою имеющуюся меру: открываю квадратную скобку и подсказка помогает мне ее найти; нажимаю кнопку "Tab", после чего мера выбрана. Далее необходимо поставить запятую для того, чтобы перейти к следующему аргументу функции, а также перейти на новую строку. Здесь, пожалуйста, обратите внимание на то, что в подсказке жирным шрифтом выделено слово "Фильтр1" — это означает, что функция ожидает от нас условия фильтрации, которые необходимо применить. Напомню, что мы пытаемся вычислить выражение, которое считает сумму скидки для продукта "Velo". Именно фраза "для продукта "Velo"" и является фильтром, который нам нужно указать в функции. Для того чтобы это сделать, мне необходимо указать, по какой колонке мы будем выполнять фильтрацию — это колонка "Product". Для того чтобы отобразить подсказки с выбором колонок, мне необходимо поставить знак апостроф, после чего появляются все колонки, которые есть в модели данных с названиями таблиц. В моем случае таблица всего одна; теперь я нахожу необходимое мне поле — это поле "Product"; также кнопкой "Tab" выбираю его, после чего эта колонка вставлена в текст формулы. И далее мне нужно указать условия фильтрации. Так как это текстовая колонка, то я указываю условие, знак "равно" и далее в кавычках пишу имя продукта, по которому необходимо отфильтровать (в моем случае это "Velo" с большой буквы), закрываю кавычку — и на этом внесение необходимых аргументов в формулу окончено. Я перехожу на новую строку и закрываю скобку. Пожалуйста, обратите внимание, что в строке формулы скобки подсвечиваются для того, чтобы вы видели, какая закрывающая скобка какой открывающей скобке соответствует. Здесь я наглядно вижу, что закрывающая скобка в строке пять соответствует открывающей скобке в строке два, а значит, все в порядке. Итак, прежде чем мы перейдем далее, давайте еще раз взглянем на ту формулу, которая у нас получилась. В первой строке у нас указано название формулы (или меры) и знак равенства, после которого будет указана непосредственно сама формула. Во второй строке мы указываем функцию, которую мы вызываем, — это функция CALCULATE. Данная функция требует от нас два аргумента (в нашем случае), их мы указываем на раздельных строках для удобства отображения. В третьей строке мы указываем то выражение, которое необходимо вычислить — в нашем случае нам нужно выяснить сумму скидки. В следующей строке мы указываем условие фильтрации, которое должно применяться перед вычислением этого значения, — в нашем случае колонку "Product" нужно отфильтровать по продукту "Velo". И на последней строке — закрывающая скобка. Итак, давайте посмотрим, что же у нас получилось? Нажимаем клавишу "Enter". Выведем значение на экран в качестве таблицы. Здесь у нас есть какое-то число; для того чтобы проверить, корректно ли оно было рассчитано, давайте сделаем следующее: мы создадим еще один визуальный элемент, где посчитаем сумму скидки. Как мы видим, сейчас сумма скидки равняется девять миллионов, а наша мера возвращает 1.5 миллиона. Далее давайте добавим еще один визуальный элемент, который позволит нам отфильтровать колонку "Product". Для этого выберем тип визуализации "Срез" и здесь поставим галочку в варианте "Velo". После этого, обратите внимание, правая часть нашего отчета изменилась: здесь поле "Discounts" равно теперь 1.5 миллиона — ровно столько, сколько возвращает наша новая мера. Это означает, что наша мера считает корректное значение, и оно отображает сумму по полю "Discounts" для продукта "Velo". Давайте посмотрим, как Power BI получает это значение. Для этого я удалю срез и удалю лишний визуальный элемент; оставлю только одно значение, выберу тип отображения "Карточка", чтобы оно было большим и наглядным. Итак, сейчас на экране моего отчета всего лишь одно значение: 1.58 миллиона условных единиц — это сумма скидки для продукта "Velo". Давайте разберем, как Power BI получил это значение. Как мы разбирали ранее, перечень шагов всегда остается одинаковый и достаточно простой при вычислении значений. Напомню: сначала мы определяем, какие фильтры действуют на отчете, затем эти фильтры применяем, после чего мы выполняем ту формулу, которая указана в тексте формулы при создании нашей меры. Итак, сейчас на экране у нас нет ни одного фильтра абсолютно. У нас есть только одно значение, поэтому переходим в нашу таблицу. Так как фильтров нет, то и применять нам нечего, поэтому мы смотрим дальше ту формулу, которая указана в мере. Кликнув на данную меру в правой части экрана в области "Поля", вверху у меня отобразилась строка формулы, чтобы было наглядно видно и более понятно. Итак, теперь в тексте формулы мы видим указание, что функция CALCULATE требует от нас применить фильтр на колонку "Product" и выбрать продукт с названием "Velo"; поэтому именно эту операцию мы и выполняем. Нажимаем "ОК". И теперь, после того как фильтр из функции CALCULATE был применен, выполняется та операция, которая указана в строке номер три (в нашем случае это сумма скидки), поэтому будет найдена колонка "Discounts" и выполнено суммирование всех значений в данной таблице. Давайте разберем еще одну ситуацию, которая возможна с данной функцией CALCULATE. Предположим, что нам необходимо отображать эти значения в виде таблицы, и в строки таблицы мы с вами выведем колонку "Product" и получим следующий результат: во всех строках данной таблицы значение всегда одинаковое. Давайте разберем, почему так происходит? Для примера возьмем продукт с названием "VTT" — здесь мы видим значение 1.5 миллиона. Давайте пройдем по шагам, которые выполняет Power BI при вычислении данного значения. Итак, первым делом определяются фильтры, которые действуют в отчете. Так как у нас выбран элемент с типом "Таблица", то значения в строках этой таблицы являются фильтрами; поэтому значение "VTT" по колонке "Product" — это фильтр, который у нас есть в нашем отчете. Далее переходим в таблицу и, как мы помним, применяем данные фильтра, поэтому в колонке "Product" выбирается вариант "VTT". После чего начинается выполнение той формулы, которую мы указали в нашей мере. Напомню, выглядит она следующим образом: здесь, в этой формуле, функция CALCULATE требует от нас поставить фильтр на колонку "Product" со значением "Velo"; но, как мы помним, на предыдущем шаге мы уже указали фильтрацию для этой колонки. Так вот, тот фильтр, который указан в функции CALCULATE, является более приоритетным. Это значит, что предыдущее действие будет отменено, и будет указан именно тот фильтр, который указан в тексте формулы (в нашем случае это значение "Velo"), поэтому здесь убирается галочка с продукта "VTT" и выбирается продукт "Velo", после чего получается вот такая таблица, и после этого вычисляется значение, которое указано в строке номер три, то есть сумма скидки. Вернемся к нашей таблице и еще раз проговорим, что же здесь происходит. А происходит следующее: отчет передает разные условия фильтрации для разных строк нашей таблицы (это разные продукты, которые указаны в первой колонке), после этого данный фильтр применяется к таблице, и Power BI начинает выполнять формулу; в тексте формулы указано новое значение фильтрации для этой же колонки. Так как значение фильтрации для колонки, которое указано в функции CALCULATE, является более приоритетным, то данные условия фильтрации попросту перезатираются и применяются именно те значения, которые указаны в функции CALCULATE. Именно благодаря этому мы видим постоянно одинаковое значение в случае, если у нас указаны разные продукты в таблице. Далее давайте разберем еще одну ситуацию. Для этого я вернусь к листу отчета, удалю "Product" из визуализации и сделаю метод отображения "Карточка"; снова увижу 1.5 миллиона. Теперь я добавлю еще один визуальный элемент с типом данных "Срез" и выберу "Сегмент". Далее я установлю фильтр по полю "Сегмент", который равен "Small business". Как мы видим, значение в карточке изменилось. Давайте разберем, что же здесь произошло, как Power BI получил именно это значение. Первый шаг — это определение фильтра, который действует в отчете. У нас есть визуальный элемент с типом "Срез", который фильтрует колонку "Сегмент" по полю "Small business"; после этого Power BI переходит к таблице и применяет данный фильтр. После того как фильтр был применен, Power BI начинает выполнять формулу, указанную в мере. Здесь у нас используется функция CALCULATE, которая устанавливает фильтр по продукту "Velo", поэтому Power BI применяет и эту фильтрацию. После того как таблица была отфильтрована, Power BI выполняет ту операцию, которая указана (в нашем случае) в третьей строке первым аргументом в функции CALCULATE — это сумма скидки. То есть находится колонка "Discounts", и все значения суммируются. На этом примере мы видим следующее: если в отчете Power BI есть какие-то условия фильтрации, то функция CALCULATE их дополняет; если же возникает конфликт между фильтрами, которые были получены в отчете, и теми, которые указаны в функции CALCULATE, то применяются те, которые указаны в формуле, то есть CALCULATE имеет приоритет. В данном блоке мы познакомились с функцией CALCULATE, которая позволяет дополнять или заменять условия фильтров, которые, в свою очередь, применяются перед выполнением математических операций с колонками таблицы. На первый взгляд может показаться, что область применения данной функции не так велика, но в будущем вы убедитесь, что фильтры в Power BI имеют огромное значение, а вместе с ними и функция CALCULATE. В следующей части мы с вами убедимся в том, что для того, чтобы использовать всю мощность языка DAX, необязательно досконально учить каждую его функцию — вместо этого можно прибегнуть к помощи инструмента "Быстрые меры", который позволяет создавать вычисления кликами мыши.