Оттачивайте свою аналитику комфортно и доступно

Visiology DAX

Знакомство с Visiology 3.X

Visiology 3 — результат многолетней разработки

Платформа не только использует аналогичный интуитивно понятный интерфейс, как самая популярная в прошлом платформа Microsoft Power BI, но и «думает» как Power BI. В ядро системы зашита поддержка языка запросов DAX, что позволяет легко и быстро перенести на Visiology уже наработанную экспертизу.
– это набор функций, операторов и констант, которые можно использовать в формуле или выражении, чтобы подсчитывать и возвращать одно или несколько значений. Говоря проще, DAX помогает создавать новую информацию из данных, уже имеющихся в модели.
Это очень простой и мощный язык, который используется во все большем количестве аналитических инструментов.
DAX (Data Analysis eXpressions)
В данном разделе мы изучим только основы самого языка, его синтаксис, контекст и основные функции.
Это можно считать введением в язык, если вы с ним не были знакомы.

Типы вычислений DAX

В DAX есть несколько способов расчёта данных, с помощью создания меры и расчётного столбца. Есть также возможность добавления вычисляемых таблиц, но его мы пропустим.
1
– столбец, который Вы добавляете в существующую таблицу (в конструкторе моделей), а затем создаете формулу DAX, которая определяет значения столбца.

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

*Расчётные столбцы пока не поддерживаются (но планируются) в Visiology, но говоря про DAX, невозможно про них не упомянуть.
Расчётный (вычисляемый) столбец*
2
– это формулы динамических вычислений, результаты которых меняются в зависимости от контекста.

Вычисляемые столбцы это безусловно, очень удобный и полезный инструмент, но производить вычисления в модели данных можно и другим способом. Если вы не хотите рассчитывать значение для каждой строки, вместо этого вам может понадобиться агрегировать данные по нескольким строкам, лучше воспользоваться – мерой.

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

Простые итоговые значения, такие как суммы, средние значения, минимумы, максимумы и счетчики, можно задать в области - всё это можно посчитать с помощью мер. Вычисленные же результаты (мерами) всегда изменяются в ответ на взаимодействие с дашбордом, что обеспечивает быстрый и динамический просмотр данных.
Меры
Мера рассчитывается в контексте видимого элемента или в контексте запроса DAX, тогда как вычисляемый столбец – в контексте строки таблицы, которой он принадлежит.

Сама мера должна быть определена внутри таблицы. Это одно из требований языка DAX. В то же время нельзя сказать, что мера принадлежит конкретной таблице, поскольку мы можем при желании перемещать ее из таблицы в таблицу без потери функциональности.

Операторы DAX

В языке выражений анализа данных (DAX) операторы используются для создания выражений, которые сравнивают значения, выполняют арифметические вычисления или работают со строками.

Существует несколько различных типов вычислительных операторов. На данный момент платформа поддерживает такие математические операторы, как сложение, вычитание, умножение, деление.
Выполняют основные математические операции, такие как добавление, вычитание, умножение; объединение чисел; и выведение числовых результатов.
Арифметические операторы
Арифметический оператор
Значение
Пример
+ (знак плюса)
Сложение
3+3
– (знак минуса)
Вычитание или знак числа
3–1–1
* (звездочка)
Умножение
3*3
/ (косая черта)
Деление
3/3

Синтаксис

Говоря о DAX, так же не стоит забывать о трёх основополагающих понятия: синтаксис, функции и контекст. Понимание этих трех концепций послужит наилучшим фундаментом для приобретения навыков DAX.

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

Рассмотрим простой пример формулы DAX, создающей новые данные (значения) для каждой строки в вычисляемом столбце Quantity в таблице Sales.

Контекст

Контекст является важным понятием при создании формул DAX. Контекст позволяет выполнять динамический анализ, при котором результаты формулы могут изменяться в зависимости от выделенной строки или ячейки и любых взаимосвязанных данных. Понимание и эффективное использование контекста важно для построения динамического анализа и для устранения неполадок в формулах.
В DAX все выражения вычисляются внутри определенного контекста.
– это своеобразное «окружение», в котором выполняется формула. То есть то, каким способом выполняется расчёт формулы.
Контекст
Формулы в табличных моделях могут вычисляться в разном контексте в зависимости от других структурных элементов, например на них влияет следующее:
  • Фильтры, примененные в сводной таблице или отчете.
  • Фильтры, определенные в формуле.
  • Отношения, указанные с помощью специальных функций в формуле.
Есть два типа контекстов DAX: контекст фильтра и контекст строки.

Контекст фильтра

Контекст фильтра ограничивает выводимые данные, тогда как контекст строки осуществляет итерации по таблице. Когда в DAX идут итерации по таблице, фильтрация не осуществляется, и наоборот. Несмотря на всю кажущуюся простоту этой концепции усвоить ее бывает непросто. Наш мозг всегда стремится пробиться к знаниям кратчайшим путем – когда он видит какие-то сходства в концепциях, он предпочитает для упрощения объединять эти концепции в одну. Не попадайтесь на эту удочку!
Возьмём для примера следующую меру:

Cost of sales = SUMX ( Sales; Sales[Quantity] * Sales[Net Price] )
В этой формуле вычисляется сумма произведений значений столбцов количества и цены из таблицы «Sales». Мы можем использовать созданную меру в отчете, мера «Cost of sales» без контекстов показывает итоговый показатель.
Само по себе это число, которое мы вычислим, не представляет большого интереса.

При этом формула сделала ровно то, что мы и попросили, – посчитала сумму по указанному выражению. Но в реальном отчете нам может понадобиться осуществить некоторые срезы по столбцам. Например, можно показать продажи в определённых городах, разместить их в строках матрицы, и в результате мы получим уже более показательный отчет.
Итоговое значение продаж по-прежнему присутствует в отчете, и сейчас оно представляет сумму продаж по городам. Все значения в отчете, в совокупности составляют предмет некого детализированного анализа. При этом можно отметить одну странность: формула делает не то, что мы ей сказали. Фактически мы не видим в каждой строке сумму по всем продажам. Вместо этого мы видим сумму продаж по конкретному городу. Заметьте при этом, что нигде в коде меры мы не указывали, что формула должна работать с подмножествами данных. Эта фильтрация произошла где-то за пределами формулы.

В каждой строке мы видим свое собственное значение по причине того, что наша формула выполняется в определенном контексте вычисления. Можно представить о контексте вычисления как о своеобразном окружении, обрамляющем ячейку, в котором происходит вычисление.
Контекст фильтра, который, как понятно из названия, осуществляет фильтрацию таблиц. И одна и та же формула может давать совершенно разные результаты в зависимости от того, в каком контексте вычисления она была выполнена.

Такое поведение формул кажется интуитивно понятным, но скрывается ряд сложностей. У каждой ячейки в отчете свой собственный контекст фильтра. Вы должны иметь в виду, что в каждой отдельно взятой ячейке может производиться свое вычисление – как если бы это был другой запрос, не зависящий от остальных ячеек в отчете.

То есть, значение в итоговой строке отчета рассчитывается не путем суммирования всех значений в столбце, а вычисляется отдельно посредством агрегирования всех строк в таблице "Sales", несмотря на то что для других строк в отчете это вычисление уже было произведено. Таким образом, в зависимости от выражения DAX итоговая строка может содержать результат, не зависящий от других строк в отчете.

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

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

Фильтр, в свою очередь, является списком кортежей, а каждый кортеж – это набор значений для определенных столбцов. В нём каждый элемент отчёта является составной частью контекста фильтра, и в каждой ячейке контекст фильтра будет свой.
Поэтому, не забывайте, что формулы в табличных моделях могут вычисляться в разном контексте в зависимости от других структурных элементов, и на них может влиять следующее:
  • Фильтры, примененные в сводной таблице или отчете.
  • Фильтры, определенные в формуле.
  • Отношения, указанные с помощью специальных функций в формуле.
Не забывайте, что контекст фильтра всегда активен и влияет на все расчёты.
ViTalk GPT
Виртуальный ассистент

Контекст строки

Контекст строки не является инструментом для фильтрации таблиц. Его предназначение – осуществлять итерации по таблице и вычислять значения в столбцах.

В DAX значения вычисляемого столбца рассчитываются построчно, но как DAX понимает, в какой строке мы находимся в текущий момент? В этом ему помогает специальный вид контекста вычисления, называемый контекстом строки. Когда мы добавляем вычисляемый столбец к таблице из миллиона строк, DAX одновременно создает контекст строки, вычисляющий значение в столбце строка за строкой.

Во время добавления вычисляемого столбца DAX по умолчанию создает контекст строки.
Также задать контекст строки вручную можно при помощи функции-итератора.
Например. Мы можем написать меру для подсчета валовой прибыли следующего содержания:

Gross Margin =
SUMX (
Sales;
Sales[Quantity] * ( Sales[Net Price] - Sales[Unit Cost] )
)
Поскольку, функция SUMX будучи итератором*, создает контекст строки, и она начинает проходить по таблице "Sales" построчно, строка за строкой, запуская (подсчитывая) выражение:

"Sales[Quantity] * ( Sales[Net Price] - Sales[Unit Cost]"

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

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

*подробнее функции-итераторы рассмотрим в разделе "Функции".

Контекст строки появляется, когда мы создаем вычисляемый столбец или рассчитываем выражение внутри итерации. Другого способа создать контекст строки не существует. Можно считать, что контекст строки необходим нам для извлечения значения столбца для конкретной строки.
!
Таким образом, главное отличие в том, что контекст фильтра ограничивает выводимые данные, а контекст строки выводит (агрегирует) значения построчно.

Функции

Функции представляют собой стандартные формулы, которые производят вычисления, используя конкретные значения, называемые аргументами и указанные в определенном порядке. Аргументом может быть другая функция, другая формула, ссылка на столбец, число, текст, логическое значение (например, TRUE или FALSE) или константа.

В DAX предусмотрены следующие категории функций: дата и время, сведения, математические, логические, статистические, текст и функции логики операций со временем.

Каждая функция выполняет определенную операцию со значениями, заключенными в аргумент. В формуле можно использовать несколько аргументов.

На данный момент поддерживаются 22 самых необходимых функций. По мере выхода новых версий список функций будет дополняться.

Типы функций DAX

1
Функция даты DATE ( <Year>, <Month>, <Day> ) выполняет вычисления значений даты. Тип данных этих значений всегда является типом данных. Возвращает указанную дату в формате datetime.
Функция даты
Пример

CALCULATE (
            SUM(Sales[SalesAmount]),
            FILTER (
                'Sales',
                AND ( 'Sales'[DateKey] > DATE ( 2012, 1, 1 ), 'Sales'[DateKey] < DATE ( 2012, 12, 31 ) )
            )
        )
2
Эти функции выполняют статистические функции и функции агрегирования значений данных в выражении DAX в Power BI. Список доступных статистических функций приведен ниже.
Статистические функции
SUMX
Для чего нужна формула SUMX? Она позволяет суммировать значения выражения по строкам.
Синтаксис формулы:
SUMX ( <таблица>, <выражение> )

<таблица> - таблица (или выражение, определяющее таблицу);
<выражение> - выражение для каждой строки таблицы.

Если вам нужно просто посчитать сумму по столбцу, используйте формулу SUM. Если нужно рассчитать построчно показатели в таблице и затем сложить их, вам потребуется SUMX.

Самый простой пример вычислений с SUMX – расчет суммы продаж по формуле = количество х цена
Пример

Продажи =
SUMX (
'продажи',
'продажи'[количество] * 'продажи'[цена] )
В таблице в каждой строке количество умножается на цену, а полученные результаты суммируются. В данном случае формула SUMX сработала очень похоже на «обычную» формулу Excel – СУММПРОИЗВ
Пример
В примере ниже SUMX построчно умножает стоимость за единицу товара unitprice на количество товара salesquantity и вычитает скидку discountamount. После выполнения всех построчных операций все значения суммируются:

SUMX(factonlinesales, factonlinesales[unitprice]*factonlinesales[salesquantity] - factonlinesales[discountamount])
DISTINCTCOUNT
Данная функция подсчитывает количество уникальных значений ячеек в столбце.
Синтаксис формулы:
DISTINCTCOUNT ([Столбец])

[Столбец] - таблица (или выражение, определяющее таблицу).
В квадратных скобках можно указывать только один столбец.

Например, нам нужно получить количество уникальных значений в столбце.
Допустим, имеется таблица, в которой в одном из столбцов перечисляются менеджеры с повторяющимися фамилиями
Если мы подсчитаем количество уникальных фамилий менеджеров при помощи следующей формулы:
Пример

Подсчет = DISTINCTCOUNT ('Таблица'[Менеджер])
То получим значение 3 (три уникальные фамилии).
3
Функции фильтров применяются, когда нужно выполнить, например, операцию сравнения при фильтрации внутри функции CALCULATE, но сравнение это делается не с константой, а с мерой.
Функции фильтров
CALCULATE
CALCULATE рассчитывает выражение с учетом измененного контекста фильтра.
Это самая главная формула в языке DAX. Ее название так и переводится – «вычислить», поэтому без такой формулы отчеты точно сделать не получится. Записывается формула просто:

CALCULATE ( <выражение> [<фильтр1>, <фильтр2> … ] )
где,
<выражение> - вычисляемое выражение
<фильтр1>, <фильтр2> - логические фильтры, табличные выражения или функции изменения фильтра (модификаторы)

В вычислениях CALCULATE часто используют вместе с функциями фильтрации, например, с FILTER. Или с модификаторами, например, REMOVEFILTERS.
FILTER
FILTER выбирает данные в таблице или в выражении по заданному критерию. Результат ее вычисления — таблица.

Синтаксис функции:
FILTER ( <таблица>, <фильтр> )
где,
<таблица> - таблица, из которой выбираются данные (или выражение, определяющее таблицу);
<фильтр> - логическое выражение, с помощью которого выполняется отбор.

В мерах FILTER обычно используют вместе с другими формулами, например, вместе с CALCULATE и др.
REMOVEFILTERS
REMOVEFILTERS очищает фильтры в указанной таблице или столбце.

Синтаксис формулы:
REMOVEFILTERS ( [ <таблица> или <столбец>[, <столбец>[, …] ] ] )
где,
<таблица> - таблица, в которой нужно очистить фильтры;
<столбец> - столбец, в котором нужно очистить фильтры.

С помощью этой функции нельзя получить «промежуточную» таблицу, а можно только убрать фильтры. Формула REMOVEFILTERS применяется в вычислениях с CALCULATE, так же
  • В рамках CALCULATE поддерживаются несколько REMOVEFILTERS.
  • Можно комбинировать с FILTER в рамках одного CALCULATE.

Например, с ее помощью можно посчитать долю (%) продаж товара от общей суммы продаж, как в примере с ALL.
Пример: найти долю от продаж товара по отношению к общей сумме выручки.
Пример
Расчет доли от общего:

SUM ( factonlinesales[salesamount] )
              / CALCULATE (
                  SUM ( factonlinesales[salesamount] ),
                  REMOVEFILTERS ( dimcustomer )
              )
4
Эти функции возвращают таблицу или обрабатывают существующие таблицы.
Табличные функции
SUMMARIZE
SUMMARIZE – одна из очень часто используемых DAX-формул. Она возвращает таблицу для запрошенных значений, объединенных в наборы групп. Обычно в расчетах эта формула используется для создания комбинации значений вместо таблицы со всеми данными.
При использовании в связке с REMOVEFILTERS восстанавливает фильтрацию по колонкам, которые были отменены в REMOVEFILTERS.
Пример

CALCULATE (
            SUM ( factonlinesales[salesamount] ),
            REMOVEFILTERS ( dimproduct ),
            SUMMARIZE (
                dimproduct,
                dimproduct[colorname]
            )
        )
5
Математические функции в выражениях анализа данных (DAX) очень похожи на математические и тригонометрические функции Excel.
Математические функции
DIVIDE
DIVIDE производит деление с обработкой ошибки “деление на ноль“. Обработка ошибки заключается в выводе альтернативного результата в случае возникновения ситуации деления на ноль.
Функция удобна, так как она сохраняет выражение от необходимости сначала протестировать значение знаменателя.

Синтаксис формулы:
REMOVEFILTERS ( [ <таблица> или <столбец>[, <столбец>[, …] ] ] )
DIVIDE (<делимое число>, <делитель>, <альтернатива>)
где,
<делимое число> - Число, которое делим, числитель;
<делитель> - Число, на которое делим, знаменатель;
<альтернатива> - значение, которое нужно вывести в случае ошибки деления на ноль (необязательный параметр). По умолчанию, если не указано иное, выводится пустое значение BLANK ().
Пример

Маржа =
DIVIDE([Profit], [Sales])
В случае, если знаменатель является константным значением, рекомендуется использовать оператор деления. В этом случае деление гарантировано завершится удачно, и выражение будет работать лучше, так как при этом не будет выполняться ненужное тестирование.
Итерационные функции или X-функции
Изучая функции вы наверняка заметили, что в DAX есть функции SUM и SUMX, COUNT и COUNTX и т.д.
Сейчас разберёмся в чём отличия на примере SUM и SUMX.
  • SUM
  • SUMX
  • COUNT
  • COUNTX
SUM - это простая агрегатная функция. Она суммирует значение, основанное на контексте фильтра. Эта мера просто вычисляет суммарное значение по всей таблице фактов, когда фильтр не выбран. И если у нас где-нибудь в нашей визуализации есть фильтр, тогда он будет вычислять сумму отфильтрованного контекста.

Average, Min, Max, Count и т. д. работают также одинаково.

SUMX - это сумма выражения, X в конце этой функции - для eXpression. Эта функция дает вам сумму любого выражения.
Как SUMX технически делает расчет? SUMX будет проходить через каждую запись таблицы ввода и запускать выражение для этой записи, он сохраняет результат этого во временную память.

По окончании разбора таблицы и вычисления всех значений для каждого отдельного столбца она суммирует их все вместе, поскольку SUMx освобождает временную память и визуализирует результат.

Из-за этого свойства ITERATION функции SUMX он также называется функцией- итератором.
Другие функции-итераторы:AverageX, MinX, MAXX, CountaX и т. д.
!
Функции-итераторы проходят через все строки во входной таблице и сохраняют результат выражения во временном хранилище. В конце они применяют агрегацию по результатам временного хранения, освобождают использование памяти и визуализируют результат вычисления.
Если вы запустите SUMX на очень большой таблице со сложным выражением, вам, вероятно, придется немного подождать, пока результаты не пройдут.

Ключевые моменты о функциях DAX

Некоторые уникальные факты о функциях DAX, которые вы должны знать, чтобы лучше их понимать.
  • Любая функция DAX всегда относится к полному столбцу/полю или таблице. Он никогда не будет относиться к отдельным значениям. Если вы хотите использовать функции для отдельных значений в столбце, вам необходимо применить фильтры в формуле DAX.
  • Функции DAX обеспечивают гибкость для создания формулы, которая применяется построчно. Расчеты или формулы применяются в соответствии с контекстом значений в каждой строке.
  • В некоторых случаях функции DAX возвращают полную таблицу, которую можно использовать в других формулах DAX, которым требуется полный набор значений. Однако вы не можете отобразить содержимое этой таблицы.
  • Функции DAX имеют категорию, известную как функции логики времени. Такие функции используются для расчета диапазонов времени/дат и периодов.

Правила формирования формул и функций

Для того, что бы формулы были более удобочитаемы и понятны не только Вам, но и другим пользователям, при написании запроса рекомендуем соблюдать Правила форматирования.

Они никак не влияют на сами расчёт и конечный результат вычисления, но всё же, рекомендуем их придерживаться, так вам будет легче прочесть саму меру и/или найти в ней ошибку.
Для столбцов, в вычислениях всегда используйте полное имя, состоящее из имени таблицы и имени самого столбца в [ ] скобках.
1
Старайтесь использовать короткое имя для мер.
2
Если формула сложная и она разбивается на несколько строк, то в первой строке оставляем имя формулы и знак равно, а сам код начинаем с новой строки.
3
  • Если в формуле больше одной функции, то разбиваем по ним код на строки.
  • Если в функции больше одного параметра, то также разбиваем код формулы на строки.
4
Если в коде используются операторы, то до и после оператора ставим пробел.
5
Если в функции 1 параметр и он состоит просто из какого-либо значения или ссылки на таблицу, столбец и меру, то код пишем в 1 строку.
6
Если в формуле есть операторы и код должен быть разбит на строки, то каждая новая строка начинается с оператора.
7
  • Открывающая круглая скобка параметров всегда находится в той же строке, где и вызов функции.
  • Закрывающая круглая скобка параметров всегда находится в новой строке, под первой буквой вызова функции.
8
Параметры, находящиеся в новых строках пишутся с отступом в 4 пробела (1 табуляция) от первой буквы имени функции.
9
Точка с запятой, разделяющая параметры находится на той же строке, что и предыдущий параметр.
10
!
Для того, чтобы удобнее было переносить курсор на новую строку с автоматическим отступов в 4 символа, воспользуйтесь сочетанием горячих клавиш клавиатуры:
  • ALT+ENTER — перенос курсора на начало новой строки;
  • SHIFT+ENTER — перенос курсора на новую строку с автоматическим отступом в 4 символа.

Создание и визуализация мер

Рассмотрим пример, в котором создадим меру, которая будет вычитать сумму скидки из общей суммы продаж. Таким образом, мы получим новое поле в таблице, которое будет содержать чистую выручку от продаж. Затем мы отобразим все три параметра (сумму со скидкой и без, а также сумму самой скидки) в столбчатой диаграмме, разбив их по кварталам.

Создание мер

Для создания мер в платформе используются функции DAX. В нашем примере мы будем использовать следующую формулу:

Чистая выручка = SUM (factonlinesales[salesamount]) - SUM (factonlinesales[discountamount])
где,
SUM (factonlinesales[salesamount])– сумма продаж;
SUM (factonlinesales[discountamount])– сумма скидок.
Чтобы создать меру, необходимо выполнить следующие шаги:
На странице создания дашбордов:
выберите таблицу, в которой вы хотите создать меру (в нашем примере это таблица фактов "factonlinesales"),
нажмите (…) и
кликните "Создать меру"
1
Созданная мера появится под названием таблицы, а в верхней части листа появится строка, в которой можно вводить формулы DAX.
2
Введите в строке формулу:
SUM (factonlinesales[salesamount]) - SUM (factonlinesales[discountamount])
и нажмите на галочку слева, чтобы закончить создание меры.

Назовем нашу меру "Чистая выручка".
3
Чтобы переименовать меру, дважды кликните по её названию и введите новое имя.

Обработка ошибок

Если формула меры содержит ошибку, напротив меры отображается восклицательный знак, что позволяет легко найти «сломанную» меру в списке колонок таблиц. При наведении курсора мыши на восклицательный знак отображается пояснительный текст.
Если формула создаваемой меры содержит ошибку, то при нажатии на галочку отображается предупреждение с пояснительным текстом.
В сводной таблице могут отображаться пустые ячейки, если результатом расчётов меры является пустое значение.

Визуализация мер

Теперь, когда мера готова, её можно добавить на виджеты для визуализации. В качестве примера мы создадим виджет "Столбчатая диаграмма", и перетаскиванием, добавим на ось Х разбивку по кварталам, а на ось Y созданную нами меру и поля с данными о сумме продаж и скидке:
Таким образом, с помощью мер, вы можете производить различные расчеты, добавляя в ваши таблицы все новые и новые данные.
Если у вас появились вопросы, напишите нам
Если у вас появились вопросы, напишите нам