Группы вычисления

Применимо к: SQL Server 2019 и более поздних версий Analysis Services Azure Analysis Services Fabric/Power BI Premium

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

Преимущества

Группы вычислений решают проблему в сложных моделях, где может быть множество избыточных мер с использованием одних и тех же вычислений, что наиболее распространено при вычислениях аналитики времени. Например, аналитик продаж хочет просматривать итоги продаж и заказы по месяцам к дате (MTD), кварталу к дате (QTD), году к дате (YTD), заказам из года к дате за предыдущий год (PY) и т. д. Средство моделирования данных должен создавать отдельные меры для каждого вычисления, что может привести к десяткам мер. Для пользователя это может означать необходимость отсортировать столько же мер и применить их по отдельности к отчету.

Давайте сначала рассмотрим, как группы вычислений отображаются для пользователей в средстве создания отчетов, например Power BI. Затем мы рассмотрим, что составляет группу вычислений и как они создаются в модели.

Группы вычисления отображаются в клиентских отчетах как таблица с одним столбцом. Столбец не похож на обычный столбец или измерение, а представляет одно или несколько повторно используемых вычислений или элементов вычислений , которые можно применить к любой мере, уже добавленной в фильтр "Значения" для визуализации.

В следующей анимации пользователь анализирует данные о продажах за 2012 и 2013 годы. Перед применением группы вычислений общая базовая мера Sales вычисляет сумму общих продаж за каждый месяц. Затем пользователь хочет применить вычисления аналитики времени, чтобы получить итоговые показатели продаж за месяц, квартал к дате, год к дате и т. д. Без групп вычислений пользователю придется выбирать отдельные меры аналитики времени.

При использовании группы вычислений, в этом примере с именем Time Intelligence, когда пользователь перетаскивает элемент вычисления времени в область фильтра Столбцы , каждый элемент вычисления отображается в виде отдельного столбца. Значения для каждой строки вычисляются из базовой меры Sales.

Группа вычислений, применяемая в Power BI

Группы вычислений работают с явными мерами DAX. В этом примере Sales — это явная мера, уже созданная в модели. Группы вычислений не работают с неявными мерами DAX. Например, в Power BI неявные меры создаются, когда пользователь перетаскивает столбцы в визуальные элементы для просмотра агрегированных значений без создания явной меры. В настоящее время Power BI создает DAX для неявных мер, записанных как встроенные вычисления DAX. Это означает, что неявные меры не могут работать с группами вычислений. Появилось новое свойство модели, видимое в табличной объектной модели (TOM), DiscourageImplicitMeasures. В настоящее время для создания групп вычислений этому свойству необходимо задать значение true. Если задано значение true, Power BI Desktop в режиме Live Connect отключает создание неявных мер.

Группы вычислений также поддерживают запросы многомерных выражений данных . Это означает, что пользователи Microsoft Excel, которые запрашивают табличные модели данных с помощью многомерных выражений, могут в полной мере использовать преимущества групп вычислений в сводных таблицах и диаграммах листа.

Принцип работы

Теперь, когда вы узнали, как группы вычислений приносят пользу пользователям, давайте посмотрим, как создается показанный пример группы вычислений Аналитики времени.

Прежде чем перейти к подробным сведениям, давайте представим некоторые новые функции DAX, специально предназначенные для групп вычислений:

SELECTEDMEASURE — используется выражениями для элементов вычисления для ссылки на меру, которая в данный момент находится в контексте. В этом примере — мера Sales.

SELECTEDMEASURENAME — используется выражениями для элементов вычисления для определения меры в контексте по имени.

ISSELECTEDMEASURE — используется выражениями для элементов вычисления для определения меры в контексте, указанной в списке мер.

SELECTEDMEASUREFORMATSTRING — используется выражениями для элементов вычисления для получения строки формата меры, которая находится в контексте.

Пример аналитики времени

Имя таблицы — аналитика времени
Имя столбца — вычисление времени
Приоритет - 20

Элементы вычислений аналитики времени

Current

SELECTEDMEASURE()

MTD

CALCULATE(SELECTEDMEASURE(), DATESMTD(DimDate[Date]))

QTD

CALCULATE(SELECTEDMEASURE(), DATESQTD(DimDate[Date]))

YTD

CALCULATE(SELECTEDMEASURE(), DATESYTD(DimDate[Date]))

PY

CALCULATE(SELECTEDMEASURE(), SAMEPERIODLASTYEAR(DimDate[Date]))

PY MTD

CALCULATE(
    SELECTEDMEASURE(),
    SAMEPERIODLASTYEAR(DimDate[Date]),
    'Time Intelligence'[Time Calculation] = "MTD"
)

PY QTD

CALCULATE(
    SELECTEDMEASURE(),
    SAMEPERIODLASTYEAR(DimDate[Date]),
    'Time Intelligence'[Time Calculation] = "QTD"
)

PY YTD

CALCULATE(
    SELECTEDMEASURE(),
    SAMEPERIODLASTYEAR(DimDate[Date]),
    'Time Intelligence'[Time Calculation] = "YTD"
)

Годовом исчислении

SELECTEDMEASURE() -
CALCULATE(
    SELECTEDMEASURE(),
    'Time Intelligence'[Time Calculation] = "PY"
)

Г/г%

DIVIDE(
    CALCULATE(
        SELECTEDMEASURE(),
        'Time Intelligence'[Time Calculation]="YOY"
    ),
    CALCULATE(
        SELECTEDMEASURE(),
        'Time Intelligence'[Time Calculation]="PY"
    )
)

Чтобы протестировать эту группу вычислений, выполните запрос DAX в SSMS или DAX Studio с открытым кодом. Примечание. В этом примере запроса опущены гг. и г/ г.

Запрос аналитики времени

EVALUATE
CALCULATETABLE (
    SUMMARIZECOLUMNS (
        DimDate[CalendarYear],
        DimDate[EnglishMonthName],
        "Current", CALCULATE ( [Sales], 'Time Intelligence'[Time Calculation] = "Current" ),
        "QTD",     CALCULATE ( [Sales], 'Time Intelligence'[Time Calculation] = "QTD" ),
        "YTD",     CALCULATE ( [Sales], 'Time Intelligence'[Time Calculation] = "YTD" ),
        "PY",      CALCULATE ( [Sales], 'Time Intelligence'[Time Calculation] = "PY" ),
        "PY QTD",  CALCULATE ( [Sales], 'Time Intelligence'[Time Calculation] = "PY QTD" ),
        "PY YTD",  CALCULATE ( [Sales], 'Time Intelligence'[Time Calculation] = "PY YTD" )
    ),
    DimDate[CalendarYear] IN { 2012, 2013 }
)

Возврат запроса аналитики времени

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

Возврат запроса аналитики времени

Строки динамического формата

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

Табличные модели поддерживают динамическое форматирование мер с помощью функции ФОРМАТ DAX. Однако функция FORMAT имеет недостаток возврата строки, заставляя возвращать меры, которые в противном случае были бы числовыми, также возвращаться в виде строки. Это может иметь некоторые ограничения, например не работать с большинством визуальных элементов Power BI в зависимости от числовых значений, таких как диаграммы.

В Power BI строки динамического форматирования для мер также позволяют условно применять строки форматирования к определенной мере без принудительного возврата строки и без использования групп вычислений. Дополнительные сведения см. в статье Строки динамического формата для мер.

Строки динамического форматирования для аналитики времени

Если мы рассмотрим приведенный выше пример аналитики времени, то все элементы вычисления, за исключением годового года, должны использовать формат текущей меры в контексте. Например, YTD , вычисляемый на основе меры Sales Base, должен быть валютой. Если бы это была группа вычислений для чего-то вроде базовой меры Orders, формат был бы числовым. В то же время в процентах должен быть процент независимо от формата базовой меры.

Для годового года можно переопределить строку формата, задав для свойства выражения строки формата значение 0,00%;-0,00%; 0,00%. Дополнительные сведения о свойствах строкового выражения формата см. в разделе Свойства ячейки многомерных выражений — содержимое СТРОКИ ФОРМАТА.

В этом визуальном элементе матрицы в Power BI отображаются значения Sales Current/YOY и Orders Current/YOY сохраняют соответствующие строки формата базовой меры. Однако sales YOY% и Orders YOY% переопределяет строку формата для использования процентного формата.

Аналитика времени в визуальном элементе матрицы

Строки динамического формата для конвертации валюты

Строки динамического формата обеспечивают простое преобразование валюты. Рассмотрим следующую модель данных Adventure Works. Он смоделирован для конвертации валюты "один ко многим " в соответствии с типами преобразования.

Курс валюты в табличной модели

Столбец FormatString добавляется в таблицу DimCurrency и заполняется строками форматирования для соответствующих валют.

Формат строкового столбца

В этом примере следующая группа вычислений определяется следующим образом:

Пример конвертации валюты

Имя таблицы — конвертация валюты
Имя столбца — вычисление преобразования
Приоритет — 5

Элементы вычисления для конвертации валюты

Без преобразования

SELECTEDMEASURE()

Преобразованная валюта

IF(
    //Check one currency in context & not US Dollar, which is the pivot currency:
    SELECTEDVALUE( DimCurrency[CurrencyName], "US Dollar" ) = "US Dollar",
    SELECTEDMEASURE(),
    SUMX(
        VALUES(DimDate[Date]),
        CALCULATE( DIVIDE( SELECTEDMEASURE(), MAX(FactCurrencyRate[EndOfDayRate]) ) )
    )
)

Формат строкового выражения

SELECTEDVALUE(
    DimCurrency[FormatString],
    SELECTEDMEASUREFORMATSTRING()
)

Примечание

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

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

Следующая анимация показывает динамическое преобразование валюты для меры Sales в отчете.

Применена строка динамического формата конвертации валюты

Выражения выделения (предварительная версия)

Выражения выбора являются необязательными свойствами, определенными для группы вычислений. Существует два типа выражений выделения:

  • multipleOrEmptySelectionExpression. Это выражение выбора применяется, если выбрано несколько элементов вычисления, выбран несуществующий элемент вычисления или если был сделан конфликтующий выбор.
  • noSelectionExpression. Это выражение выбора применяется, если группа вычислений не фильтруется.

Оба этих выражения выбора также имеют строковое выражение динамического формата formatStringDefinition.

Таким образом, в группе вычислений можно определить следующее:

...
"calculationGroup": {
  "multipleOrEmptySelectionExpression": {
    "expression": "",
    "formatStringDefinition": {...}
  },
  "noSelectionExpression": {
    "expression": "",
    "formatStringDefinition": {...}
  }
...
}

Примечание

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

Ниже приведен обзор этих выражений и их поведения по умолчанию, если они не указаны:

Тип выделения Выражение выделения не определено (по умолчанию) Определено выражение выделения
Выбор одного элемента Применяется выделение Применяется выделение
Выбор нескольких элементов Группа вычислений не фильтруется Возвращает результат вычисления multipleOrEmptySelectionExpression
Пустое выделение Группа вычислений не фильтруется Возвращает результат вычисления multipleOrEmptySelectionExpression
Не выбрано Группа вычислений не фильтруется Возвращает результат вычисления noSelectionExpression

Множественный или пустой выбор

Если выбрано несколько вариантов для одной группы вычислений, группа вычислений будет оценивать и возвращать результат multipleOrEmptySelectionExpression, если он определен. Если это выражение не определено, группа вычислений вернет следующий результат:

SELECTEDMEASURE()

В качестве примера рассмотрим группу вычислений с именем MyCalcGroup, в которой настроено выражение multipleOrEmptySelectionExpression следующим образом:

IF (
ISFILTERED ( 'MyCalcGroup' ),
    "Filters: " 
         & CONCATENATEX ( 
  	            FILTERS ( 'MyCalcGroup'[Name] ),
            'MyCalcGroup'[Name], 
            ", "
     	   )
)

Теперь представьте следующее выделение в группе вычислений:

EVALUATE
{
    CALCULATE (
        [MyMeasure],
        'MyCalcGroup'[Name] = "item1" || 'MyCalcGroup'[Name] = "item2"
    )
}

Здесь мы выбираем два элемента в группе вычислений: "item1" и "item2". Это множественный выбор, и, следовательно, multipleOrEmptySelectionExpression вычисляется и возвращает следующий результат: "Фильтры: item1, item2".

Затем выполните следующий выбор в группе вычислений:

EVALUATE
{
    CALCULATE (
        [MyMeasure],
        'MyCalcGroup'[Name] = "item4" -- item4 does not exists
    )
}

Это пример пустого выделения, так как "item4" не существует в этой группе вычислений. Таким образом, multipleOrEmptySelectionExpression вычисляется и возвращает следующий результат: "Фильтры: ".

Не выбрано

NoSelectionExpression для группы вычислений будет применено, если группа вычислений не была отфильтрованы. Это в основном используется для выполнения действий по умолчанию без необходимости выполнения пользователем действий, сохраняя гибкость для пользователя, чтобы переопределить действие по умолчанию. Например, рассмотрим автоматическую конвертацию валюты с долларом США в качестве центральной валюты.

Мы можем настроить группу вычислений со следующим параметром noSelectionExpression:

IF (
    //Check one currency in context & not US Dollar, which is the pivot currency:
    SELECTEDVALUE (
        DimCurrency[CurrencyName],
        "US Dollar"
    ) = "US Dollar",
    SELECTEDMEASURE (),
    SUMX (
        VALUES ( DimDate[DateKey] ),
        CALCULATE (
            DIVIDE ( SELECTEDMEASURE (), MAX ( FactCurrencyRate[EndOfDayRate] ) )
        )
    )
)

Мы также зададим formatStringDefinition для этого выражения:

SELECTEDVALUE(
  DimCurrency[FormatString],
  SELECTEDMEASUREFORMATSTRING()
)

Теперь, если не выбрана валюта, все валюты будут автоматически преобразованы в pivot currency (доллар США) при необходимости. Кроме того, вы по-прежнему можете выбрать другую валюту для преобразования в эту валюту без переключения элементов вычислений, как это было бы необходимо сделать без noSelectionExpression.

Приоритет

Приоритет — это свойство, определенное для группы вычислений. Он задает порядок объединения групп вычислений с базовой мерой при использовании SELECTEDMEASURE() в элементе вычисления.

Пример приоритета

Рассмотрим простой пример. Эта модель имеет меру с указанным значением 10 и две группы вычислений, каждая из которых содержит один элемент вычисления. Мы применим к мере элементы вычислений обеих групп вычислений. Вот как мы настроим его:

'Measure group'[Measure] = 10

Первая группа вычислений — , 'Calc Group 1 (Precedence 100)' а элемент вычисления — 'Calc item (Plus 2)':

'Calc Group 1 (Precedence 100)'[Calc item (Plus 2)] = SELECTEDMEASURE() + 2

Вторая группа вычислений — , 'Calc Group 2 (Precedence 200)' а элемент вычисления — 'Calc item (Times 2)':

'Calc Group 2 (Precedence 200)'[Calc item (Times 2)] = SELECTEDMEASURE() * 2

Вы видите, что группа вычислений 1 имеет приоритет 100, а группа вычислений 2 имеет приоритет 200.

С помощью SQL Server Management Studio (SSMS) или внешнего средства с функциями чтения и записи XMLA, например табличного Редактор с открытым кодом, можно использовать скрипты XMLA для создания групп вычислений и задания значений приоритета. Здесь мы добавим "Calc group 1 (Precedence 100)":

{
  "createOrReplace": {
    "object": {
      "database": "CHANGE TO YOUR DATASET NAME",
      "table": "Calc group 1 (Precedence 100)"
    },
    "table": {
      "name": "Calc group 1 (Precedence 100)",
      "calculationGroup": {
        "precedence": 100,
        "calculationItems": [
          {
            "name": "Calc item (Plus 2)",
            "expression": "SELECTEDMEASURE() + 2",
          }
        ]
      },
      "columns": [
        {
          "name": "Calc group 1 (Precedence 100)",
          "dataType": "string",
          "sourceColumn": "Name",
          "sortByColumn": "Ordinal",
          "summarizeBy": "none",
          "annotations": [
            {
              "name": "SummarizationSetBy",
              "value": "Automatic"
            }
          ]
        },
        {
          "name": "Ordinal",
          "dataType": "int64",
          "isHidden": true,
          "sourceColumn": "Ordinal",
          "summarizeBy": "sum",
          "annotations": [
            {
              "name": "SummarizationSetBy",
              "value": "Automatic"
            }
          ]
        }
      ],
      "partitions": [
        {
          "name": "Partition",
          "mode": "import",
          "source": {
            "type": "calculationGroup"
          }
        }
      ]
    }
  }
}

И этот скрипт добавляет "Calc group 2 (Precedence 200)":

{
  "createOrReplace": {
    "object": {
      "database": "CHANGE TO YOUR DATASET NAME",
      "table": "Calc group 2 (Precedence 200)"
    },
    "table": {
      "name": "Calc group 2 (Precedence 200)",
      "calculationGroup": {
        "precedence": 200,
        "calculationItems": [
          {
            "name": "Calc item (Times 2)",
            "expression": "SELECTEDMEASURE() * 2"
          }
        ]
      },
      "columns": [
        {
          "name": "Calc group 2 (Precedence 200)",
          "dataType": "string",
          "sourceColumn": "Name",
          "sortByColumn": "Ordinal",
          "summarizeBy": "none",
          "annotations": [
            {
              "name": "SummarizationSetBy",
              "value": "Automatic"
            }
          ]
        },
        {
          "name": "Ordinal",
          "dataType": "int64",
          "isHidden": true,
          "sourceColumn": "Ordinal",
          "summarizeBy": "sum",
          "annotations": [
            {
              "name": "SummarizationSetBy",
              "value": "Automatic"
            }
          ]
        }
      ],
      "partitions": [
        {
          "name": "Partition",
          "mode": "import",
          "source": {
            "type": "calculationGroup"
          }
        }
      ]
    }
  }
}

В Power BI Desktop у нас есть визуальный элемент карта, показывающий меру и срез для каждой группы вычислений в представлении отчета:

Отдельные выражения группы мер.

При выборе обоих срезов необходимо объединить выражения DAX. Для этого мы начнем с элемента вычисления с наивысшим приоритетом 200, а затем заменим аргумент SELECTEDMEASURE() следующим самым высоким значением, 100.

Таким образом, выражение DAX элемента вычисления с наивысшим приоритетом:

SELECTEDMEASURE() * 2 

Вторым выражением DAX элемента вычисления приоритета является:

SELECTEDMEASURE() + 2 

Теперь они объединяются путем замены части SELECTEDMEASURE() элемента вычисления с наивысшим приоритетом следующим элементом вычисления с наивысшим приоритетом, как показано ниже:

( SELECTEDMEASURE() + 2 ) * 2

Затем, если есть больше элементов вычисления, мы продолжаем, пока не перейдем к базовой мере. В этой модели существует только две группы вычислений, поэтому теперь мы заменим SELECTEDMEASURE() самой мерой, как показано ниже:

( ( [Measure] ) + 2 ) * 2

Как и в нашем Measure = 10, это то же самое, что и:

( ( 10 ) + 2 ) * 2

Если аргументы SELECTEDMEASURE() отсутствуют, вычисляется объединенное выражение DAX:

( ( 10 ) + 2 ) * 2 = 24

В Power BI Desktop, когда обе группы вычислений применяются с помощью среза, выходные данные меры выглядят следующим образом:

Объединенные выражения группы мер.

Но имейте в виду, что сочетание вложено таким образом, что выходные данные не будут 10 + 2 * 2 = 14, как вы видите здесь:

Вложенные выражения группы мер.

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

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

Пример приоритета со средними значениями

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

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

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

Наши предположения:

Имя таблицы — Averages.
Имя столбца — Среднее вычисление.
Приоритет равен 10.

Элементы вычисления для средних значений

Нет среднего

SELECTEDMEASURE()

Сутки

DIVIDE(SELECTEDMEASURE(), COUNTROWS(DimDate))

Ниже приведен пример запроса DAX и возвращаемой таблицы.

Запрос со средними значениями

EVALUATE
    CALCULATETABLE (
        SUMMARIZECOLUMNS (
        DimDate[CalendarYear],
        DimDate[EnglishMonthName],
        "Sales", CALCULATE (
            [Sales],
            'Time Intelligence'[Time Calculation] = "Current",
            'Averages'[Average Calculation] = "No Average"
        ),
        "YTD", CALCULATE (
            [Sales],
            'Time Intelligence'[Time Calculation] = "YTD",
            'Averages'[Average Calculation] = "No Average"
        ),
        "Daily Average", CALCULATE (
            [Sales],
            'Time Intelligence'[Time Calculation] = "Current",
            'Averages'[Average Calculation] = "Daily Average"
        ),
        "YTD Daily Average", CALCULATE (
            [Sales],
            'Time Intelligence'[Time Calculation] = "YTD",
            'Averages'[Average Calculation] = "Daily Average"
        )
    ),
    DimDate[CalendarYear] = 2012
)

Среднее значение возвращаемого запроса

Среднее значение возвращаемого запроса

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

Имя столбца Вычисление
YTD Сумма продаж за январь, февраль, март 2012 г.
= 495 364 + 506 994 + 373 483
Сутки Продажи за март 2012 г., разделенные на число дней в марте
= 373 483 / 31
Среднее ежедневное значение по годам YTD за март 2012 г., разделенный на число дней в январе, феврале и марте
= 1 375 841 / (31 + 29 + 31)

Ниже приведено определение элемента вычисления YTD, применяемого с приоритетом 20.

CALCULATE(SELECTEDMEASURE(), DATESYTD(DimDate[Date]))

Ниже приведено среднее значение дня, применяемое с приоритетом 10.

DIVIDE(SELECTEDMEASURE(), COUNTROWS(DimDate))

Так как приоритет группы вычислений аналитики времени выше приоритета группы вычислений "Средние", она применяется как можно более широко. Вычисление YTD Дневное среднее применяется к числителю и знаменателю (количеству дней) дневного среднего вычисления.

Это эквивалентно следующему выражению:

CALCULATE(DIVIDE(SELECTEDMEASURE(), COUNTROWS(DimDate)), DATESYTD(DimDate[Date]))

Не это выражение:

DIVIDE(CALCULATE(SELECTEDMEASURE(), DATESYTD(DimDate[Date])), COUNTROWS(DimDate)))

Рекурсия в сторону

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

DIVIDE(
    CALCULATE(
        SELECTEDMEASURE(),
        'Time Intelligence'[Time Calculation]="YOY"
    ),
    CALCULATE(
        SELECTEDMEASURE(),
        'Time Intelligence'[Time Calculation]="PY"
    )
)

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

Один элемент вычисления в контексте фильтра

В нашем примере аналитики времени элемент вычисления PY YTD имеет одно вычисляемое выражение:

CALCULATE(
    SELECTEDMEASURE(),
    SAMEPERIODLASTYEAR(DimDate[Date]),
    'Time Intelligence'[Time Calculation] = "YTD"
)

Аргумент YTD для функции CALCULATE() переопределяет контекст фильтра для повторного использования логики, уже определенной в элементе вычисления YTD. Невозможно применить как PY, так и YTD в одной оценке. Группы вычислений применяются, только если один элемент вычисления из группы вычислений находится в контексте фильтра.

Упорядочение

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

Чтобы указать порядковый номер для элементов вычисления, необходимо добавить второй столбец в группу вычислений. В отличие от столбца по умолчанию, в котором типом данных является Text, второй столбец, используемый для упорядочивания элементов вычисления, имеет тип данных Whole Number. Единственная цель этого столбца — указать числовой порядок, в котором отображаются элементы вычисления в группе вычислений. Так как этот столбец не содержит значения в отчете, рекомендуется задать для свойства Hidden значение True.

Столбец для упорядочения

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

Свойство Ordinal

Дополнительные сведения см. в статье Порядок элементов вычислений.

Создание группы вычислений

Группы вычислений поддерживаются в Visual Studio с помощью VSIX версии 2.9.2 и более поздних версий проектов служб Analysis Services. Группы вычислений также можно создать с помощью языка сценариев табличных моделей (TMSL) или открытый код табличного Редактор.

Создание группы вычислений с помощью Visual Studio

  1. В Обозреватель табличной модели щелкните правой кнопкой мыши Группы вычислений и выберите команду Создать группу вычислений. По умолчанию новая группа вычислений имеет один столбец и один элемент вычисления.

  2. Используйте свойства , чтобы изменить имя и ввести описание для группы вычислений, столбца и элемента вычисления по умолчанию.

  3. Чтобы ввести выражение формулы DAX для элемента вычисления по умолчанию, щелкните правой кнопкой мыши и выберите команду Изменить формулу, чтобы открыть Редактор DAX. Введите допустимое выражение.

  4. Чтобы добавить дополнительные элементы вычислений, щелкните правой кнопкой мыши Элемент вычисления и выберите пункт Создать элемент вычисления.

Порядок элементов вычислений

  1. В Обозреватель табличной модели щелкните правой кнопкой мыши группу вычислений и выберите команду Добавить столбец.

  2. Присвойте столбцу имя Ordinal (или что-то подобное), введите описание, а затем задайте для свойства Hidden значение True.

  3. Для каждого элемента вычисления, который требуется упорядочить, задайте для свойства Ordinal положительное число. Каждое число является последовательным, например, элемент вычисления со порядковым свойством 1 появляется первым, свойство 2 — вторым и т. д. Элементы вычисления со значением по умолчанию -1 не включаются в порядок, но отображаются перед упорядоченными элементами в отчете.

Ограничения

Безопасность на уровне объектов (OLS), определенная в таблицах групп вычислений, не поддерживается. Однако OLS можно определить в других таблицах в той же модели. Если элемент вычисления ссылается на защищенный объект OLS, возвращается общая ошибка.

Безопасность на уровне строк (RLS) не поддерживается. Определите RLS в таблицах в той же модели, но не в самих группах вычислений (прямо или косвенно).

Группы вычислений не поддерживают Выражения строк детализации.

визуальный элемент с автоописанием визуальные элементы в Power BI не поддерживаются с группами вычислений.

Неявные агрегаты столбцов в Power BI не поддерживаются для моделей с группами вычислений. В настоящее время, если свойство DiscourageImplicitMeasures имеет значение false (по умолчанию), параметры агрегирования отображаются, однако они не могут быть применены. Если параметру DiscourageImplicitMeasures присвоено значение true, параметры агрегирования не отображаются.

При создании отчетов Power BI с помощью LiveConnection строки динамического формата не применяются к мерам уровня отчета.

См. также раздел

DAX в табличных моделях
Справочник по DAX