# Внутренние и внешние выражения множества

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

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

Пример: Внутреннее выражение множества

```
Sum( {$<Year={2021}>} Sales )
```

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

Если используется внешнее выражение множества, оно должно быть помещено в начало определения области.

Пример: Внешнее выражение множества

```
{<Year={2021}>} Sum(Sales) / Count(distinct Customer)
```

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

Пример: Внешнее выражение множества применяется к основной мере

```
{<Year={2021}>} [Master Measure]
```

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

Пример: Определение лексической области

```
( {<Year={2021}>} Sum(Amount) / Count(distinct Customer) ) – Avg(CustomerSales)
```

## Правила

#### Лексическая область

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

#### Позиция

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

#### Контекст

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

Контекст также можно определить в виде внешнего выражения множества.

#### Наследование

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

* {$&lt;SetExpression&gt;} — переопределяет внешнее выражение множества

* {&lt;SetExpression&gt;} — объединяется с внешним выражением множества

#### Назначение множества элементов

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

* {&lt;Field={value}&gt;} — эта внутренняя выборка заменяет любую внешнюю выборку в “Field”.

* {&lt;Field+={value}&gt;} — эта внутренняя выборка объединяется с внешней выборкой в “Field” с помощью оператора объединения.

* {&lt;Field\*={value}&gt;} — эта внутренняя выборка объединяется с внешней выборкой в “Field” с помощью оператора пересечения.

#### Наследование в несколько этапов

Наследование может происходить в несколько этапов. Примеры:

* Текущая выборка → Sum(Amount)

  Функция агрегирования будет использовать контекст, который здесь является текущей выборкой.

* Текущая выборка → {&lt;Set1&gt;} Sum(Amount)

  Set1 будет наследоваться от текущей выборки, а результат будет контекстом для функции агрегирования.

* Текущая выборка → {&lt;Set1&gt;} ({&lt;Set2&gt;} Sum(Amount))

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

#### Функция Aggr()

Функция Aggr() создает вложенное агрегирование, которое имеет два независимых агрегирования. В приведенном ниже примере Count() вычисляется для каждого значения Dim и полученный массив агрегируется с помощью функции Sum().

Пример:

```
Sum(Aggr(Count(X),Dim))
```

Count() — внутреннее агрегирование, а Sum() — внешнее агрегирование.

* Внутреннее агрегирование не наследует никакого контекста от внешнего агрегирования.

* Внутреннее агрегирование наследует контекст от функции Aggr(), которая может содержать выражение множества.

* И функция Aggr(), и функция внешнего агрегирования наследуют контекст от внешнего выражения множества.