Использование SELECTEDVALUE вместо VALUES

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

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

Australian Sales Tax =
IF(
    HASONEVALUE(Customer[Country-Region]),
    IF(
        VALUES(Customer[Country-Region]) = "Australia",
        [Sales] * 0.10
    )
)

В этом примере функция HASONEVALUE возвращает значение TRUE только тогда, когда в контексте текущего фильтра отображается только одно значение столбца Страна или регион. Если значение равно TRUE, функция VALUES сравнивается с литеральным текстом "Australia" (Австралия). Когда функция VALUES возвращает значение TRUE, мера Sales (Продажи) умножается на 0,10 (то есть 10 %). Если функция HASONEVALUE возвращает значение FALSE по той причине, что столбец фильтруется более чем по одному значению, первая функция IF возвращает пустое значение.

Использование функции HASONEVALUE является мерой предосторожности. Оно необходимо по той причине, что столбец Country-Region может фильтроваться по нескольким значениям. В этом случае функция VALUES возвращает таблицу с несколькими строками. Сравнение таблицы из нескольких строк со скалярным значением вызывает ошибку.

Рекомендация

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

Перепишем определение меры из примера, используя функцию SELECTEDVALUE.

Australian Sales Tax =
IF(
    SELECTEDVALUE(Customer[Country-Region]) = "Australia",
    [Sales] * 0.10
)

Совет

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

См. также