Выполнение контекстного перехода
Что происходит при вычислении меры или выражения меры в контексте строки? Этот сценарий может возникнуть в формуле вычисляемого столбца или при вычислении выражения в функции-итераторе.
В следующем примере мы добавим вычисляемый столбец в таблицу Customer, чтобы классифицировать клиентов по классам лояльности. Этот сценарий прост. Если доход, предоставляемый клиентом, составляет менее 2500 долларов США, клиент классифицируется как Low; в противном случае он классифицируется как High.
Customer Segment =
VAR CustomerRevenue = SUM(Sales[Sales Amount])
RETURN
IF(CustomerRevenue < 2500, "Low", "High")
На стр. 4 отчета добавьте столбец Customer Segment в условных обозначениях круговой диаграммы.
Обратите внимание, что существует только одно значение Customer Segment. Причина этого заключается в том, что формула вычисляемого столбца выдает неверный результат: Каждому клиенту назначается значение High, так как выражение SUM(Sales[Sales Amount])
не вычисляется в контексте фильтра. Следовательно, каждый клиент оценивается по сумме каждого значения столбца Sales Amount в таблице Sales.
Чтобы принудительно выполнить вычисление выражения SUM(Sales[Sales Amount])
для каждого клиента, необходимо выполнить контекстный переход, который применяет значения столбца в контексте строки для фильтрации контекста. Этот переход можно выполнить с помощью функции CALCULATE
без передачи выражений фильтра.
Измените определение вычисляемого столбца таким образом, чтобы оно получало правильный результат.
Customer Segment =
VAR CustomerRevenue = CALCULATE(SUM(Sales[Sales Amount]))
RETURN
IF(CustomerRevenue < 2500, "Low", "High")
В визуальном элементе круговой диаграммы добавьте новый вычисляемый столбец в категорию условных обозначений и убедитесь, что теперь отображаются два сегмента круговой диаграммы.
В этом случае функция CALCULATE
применяет значения контекста строк в качестве фильтров. Это называется контекстным переходом. Чтобы быть точным, процесс не работает так, как если бы в таблице был уникальный столбец. Если в таблице есть уникальный столбец, чтобы выполнить переход, к нему необходимо применить фильтр. В этом случае Power BI применяет фильтр к столбцу CustomerKey для значения в контексте строки.
При ссылке на меры в выражении, вычисляемом в контексте строки, переход контекста выполняется автоматически. Поэтому не нужно передавать ссылки на меры в функцию CALCULATE
.
Измените определение вычисляемого столбца, которое ссылается на меру Revenue, и обратите внимание на то, что она будет выдавать правильный результат.
Customer Segment =
VAR CustomerRevenue = [Revenue]
RETURN
IF(CustomerRevenue < 2500, "Low", "High")
Теперь можно выполнить формулу меры Sales Commission. Чтобы получить итоговое значение, необходимо использовать функцию-итератор для прохода по всем регионам в контексте фильтра. Выражение функции-итератора должно использовать функцию CALCULATE
для перехода контекста строки в контекст фильтра. Обратите внимание, что больше не требуется проверять, находится ли значение столбца Country в таблице Sales Territory в контексте фильтра, так как известно, что фильтрация выполняется по одной стране (так как она проверяет регионы в контексте фильтра, а регион связан только с одной страной).
Перейдите на стр. 3 отчета, а затем измените определение меры Sales Commission, чтобы использовать функцию-итератор SUMX
:
Sales Commission =
SUMX(
VALUES('Sales Territory'[Region]),
CALCULATE(
[Revenue]
* IF(
VALUES('Sales Territory'[Country]) = "United States",
0.15,
0.1
)
)
)
Теперь в визуальном элементе таблицы отображается суммарная комиссия от продаж по всем регионам.