The importance of Only()
Only() возвращает значение, если в группе есть только одно возможное значение. Это значение будет результатом агрегирования. Qlik Sense использует по умолчанию Only(), если функция агрегирования не указана.
Если между измерением диаграммы и параметром существует отношение «один к одному», функция Only() возвращает единственное возможное значение. Если есть несколько значений, она возвращает NULL. Например, при поиске одного продукта, где цена за единицу = 12, будет возвращено значение NULL, если цена за единицу 12 есть у нескольких продуктов.
На следующих изображениях показаны различия между отношениями «один к одному» и «один ко многим»:
Функция Only() — это функция агрегирования. Она использует много записей в качестве входных данных и возвращает лишь одно значение, подобно Sum() или Count(). Qlik Sense использует агрегирования фактически во всех вычислениях. Выражения в диаграмме, в выражении сортировки, в текстовом поле, в расширенном поиске и в вычисленной метке являются агрегированиями и могут быть вычислены только с участием функции агрегирования.
Но что будет, если пользователь вводит выражение, в котором нет явной функции агрегирования? Например, что будет, если для выражения сортировки установлено значение Date? Или что будет, если есть расширенный поиск купивших пиво и вино клиентов с помощью выражения =[Product Type]='Beer and Wine'?
В этих случаях функция Only() влияет на вычисление. Если функция агрегирования не задана явно в выражении, Qlik Sense использует функцию Only() неявно. В приведенных выше случаях Only(Date) используется в качестве выражения сортировки и Only([Product Type])='Beer and Wine' используется в качестве критерия поиска.
Иногда новое выражение возвращает неожиданный результат. Оба из приведенных выше примеров будут работать в тех случаях, когда есть только одно возможное значение — Date или Product Type, но эти примеры не будут работать, когда есть несколько значений.
Другие выражения с использованием Only()
Создадим четыре KPI с подобными выражениями. Таким образом можно сравнить, как наличие ссылок на явное поле или наличие Only() в другом месте в нашем выражении окажет большое влияние на результаты выборки.
В приложении на листе Importance of Only() находится фильтр с Invoice Date в качестве измерения.
Выполните следующие действия.
- Создайте KPI.
- Щелкните команду Добавить меру. Щелкните символ .
Откроется редактор выражения. - Введите следующее: Month([Invoice Date])
- Создайте еще три KPIs с мерами: Month(Only([Invoice Date])), Month(Max([Invoice Date])) и Only(Month([Invoice Date])).
- Щелкните Применить.
При наличии ссылки на явное поле функция Only() вставляется на самом низком уровне. Это означает, что первые два KPI (Month([Invoice Date]) и Month(Only([Invoice Date]))) будут интерпретироваться одинаково и всегда давать тот же результат.
Как видно, три из четырех KPI возвращают NULL. Третий KPI, Month(Max([Invoice Date])), возвращает значение даже при том, что выборка не была сделана.
При создании выражений необходимо всегда обдумать, какое агрегирование или какое значение нужно использовать, если значений несколько. Если нужно использовать NULL для представления нескольких значений, можно оставить выражение как есть. Вместо него для чисел, вероятно, следует использовать Sum(), Avg(), Min() или Max(). Для строк можно использовать Only() или MinString().
Выполните следующие действия.
- Прекратите изменение листа.
- В фильтре выберите дату в январе.
- Подтвердите выборку, щелкнув элемент .
Если сделана одиночная выборка, все KPI возвращают правильный результат. Даже если выражение содержит ссылку на явное поле, такую как выражение в Month([Invoice Date]), то одиночная выборка позволяет ему вернуть собственное значение.
Выполните следующие действия.
- В фильтре выберите еще одну дату в январе.
- Подтвердите выборку, щелкнув элемент .
Первые два KPI возвращают NULL, а другие два KPI — правильное значение января. А именно, четвертый KPI возвращает правильный результат, потому что обе выборки сделаны для дат в январе.
Выполните следующие действия.
- Выберите еще одну дату в фильтре, но теперь в другом месяце.
- Подтвердите выборку, щелкнув элемент .
Когда сделано несколько выборок с датами в различных месяцах, только третий KPI вернет значение. Он возвращает значение самого большого месяца из сделанной выборки согласно выражению Month(Max([Invoice Date])). Так как Only() вставляется автоматически в выражения с ссылками на явное поле, не всегда можно полагаться на то, что для выражения подойдет самый низкий уровень. Расположение Only() важно.
Для получения дополнительной информации см. Only — функция диаграммы