Перейти к содержанию

case

case проверяет, соответствует ли значение списку условий, и возвращает некоторые выходные данные на основе первого выполненного условия. По сути, case работает так же, как логика "if... then", но составлять выражения с case легче.

Если нужно, вы можете указать case вернуть значение по умолчанию, если ни одно из условий не выполнено. Если не задано значение по умолчанию, case вернёт null после проверки всех ваших условий (значения null отображаются как пустые значения в Glarus BI).

Используйте выражение case, когда вам нужно:

Синтаксис
case(условие1, значение1, условие2, значение2, ..., значение-по-умолчанию)
Возвращает результат первого выполненного условия.
Пример
case(isempty("стакан наполовину полный"), "пустой стакан", isnull("стакан наполовину полный"), "нет стакана", "стакан наполовину полный")
"стакан наполовину полный"

Разделение данных для частотных таблиц или гистограмм

Величина Диапазон
6 0–9
18 10–19
31 30–39
57 50+

где Диапазон — это настраиваемый столбец с выражением:

case([Величина] >= 0  AND [Величина] <=  9,  "0–9",
     [Величина] >= 10 AND [Величина] <= 19,  "10–19",
     [Величина] >= 20 AND [Величина] <= 29,  "20–29",
     [Величина] >= 30 AND [Величина] <= 39,  "30–39",
     [Величина] >= 40 AND [Величина] <= 49,  "40–49", "50+")

Пометка строки на основе условий из нескольких столбцов

ID наблюдения Есть крылья Есть морда Тип наблюдения
1 TRUE TRUE Птица
2 TRUE FALSE Самолёт
3 FALSE FALSE Супермен
4 FALSE TRUE Неизвестно

где Тип наблюдения представляет собой настраиваемый столбец с выражением:

case([Есть крылья] = TRUE  AND [Есть морда] = TRUE,  "Птица",
     [Есть крылья] = TRUE  AND [Есть морда] = FALSE, "Самолёт",
     [Есть крылья] = FALSE AND [Есть морда] = TRUE,  "Супермен", "Неизвестно")

Вы можете использовать столбцы, содержащие ваши «метки», чтобы:

Агрегирование данных на основе условий из нескольких столбцов

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

Например, если хотите подсчитать количество уникальных заказов в статусе «Отправлен» для каждой даты заказа:

ID заказа Дата заказа Статус
1 2025-04-01 Оплачен
1 2025-04-03 Отправлен
2 2025-05-12 Оплачен
2 2025-05-12 Отменён
  1. Создайте пользовательское выражение distinct(case([Статус] = "Отправлен", [ID заказа])) и назовите его "Всего отправленных заказов".
  2. Выберите Дата заказа в качестве группы по столбцу.
  3. Нажмите Визуализировать, чтобы вернуть результат:
Дата заказа Всего отправленных заказов
2025-04-01 1
2025-05-01 0

Допустимые типы данных

Тип данных Работает с case
Строка
Число
Время
Условие
JSON

Информация о типах данных приведена в разделе обучения руководства Metabase (англ.).

Ограничения

Все выходные данные должны иметь одинаковый тип данных.

Избегайте:

case(условие1, "строка", условие2, TRUE, условие3, 1)

Делайте:

case(условие1, "строка", условие2, "TRUE", условие3, "1")

Связанные функции

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

Выражения в Glarus BI

Другие инструменты

coalesce

Используем таблицу из Слияние: консолидация значений. Пример:

Заметки Комментарии coalesce([Заметки], [Комментарии] "Нет заметок или комментариев.")
У меня есть заметка. У меня есть комментарий. У меня есть заметка.
У меня есть комментарий. У меня есть комментарий.
У меня есть заметка. У меня есть заметка.
Нет заметок или комментариев.

coalesce в выражениях Glarus BI

coalesce([Заметки], [Комментарии] "Нет заметок или комментариев.")

идентично выражению case

case(ISBLANK([Заметки]) = FALSE AND ISBLANK([Комментарии]) = FALSE, [Заметки],
     ISBLANK([Заметки]) = TRUE  AND ISBLANK([Комментарии]) = FALSE, [Комментарии],
     ISBLANK([Заметки]) = FALSE AND ISBLANK([Комментарии]) = TRUE,  [Заметки],
     ISBLANK([Заметки]) = TRUE  AND ISBLANK([Комментарии]) = TRUE,  "Нет заметок или комментариев.")

coalesce легче писать, если вы не против взять первое значение, когда оба ваших столбца не пусты. Используйте case, если вы хотите определить конкретный вывод для этого случая (например, «У меня есть заметка и комментарий»).

countif: счёт если

Использование таблицы из Агрегирование данных Пример:

ID заказа Дата заказа Статус
1 2025-04-01 Оплачен
1 2025-04-03 Отправлен
2 2025-05-12 Оплачен
2 2025-05-12 Отменён

выражение Glarus BI счет если countif

countif(case([Статус] = "Отправлен"))

идентично выражению case:

count(case([Статус] = "Отправлен", [ID заказа]))

countif работает идентично case, когда вы подсчитываете все строки в таблице, соответствующие вашим условиям. Но не эквивалентно, если вы хотите подсчитать уникальные строки, соответствующие вашим условиям.

sumif: сумма если

Использование расширенной версии таблицы из раздела Агрегирование данных Пример:

ID ряда ID заказа Дата заказа Статус Сумма
1 1 2025-04-01 Оплачен \$20
2 1 2025-04-03 Отправлен \$20
3 2 2025-05-12 Оплачен \$80
4 2 2025-05-12 Отменён \$80

выражение Glarus BI sumif

sumif([Величина], [Статус] = "Отправлен")

идентично выражению case:

sum(case([Status] = "Отправлен", [Величина]))

sumif идентично case когда вы суммируете один столбец для одного условия.

Используйте case, если хотите суммировать второй столбец по второму, отдельному условию. Например, если вы хотите суммировать столбец Сумма, когда Статус = «Отправлен», и другой (гипотетический) столбец, например Возвращённая сумма, когда Статус = «Возвращён».

SQL

В большинстве случаев (если вы не используете базу данных NoSQL) запросы, созданные в конструкторе запросов, преобразуются в SQL-запросы, которые выполняются в вашей базе данных или хранилище данных. Выражения case Glarus BI преобразуются в операторы SQL CASE WHEN.

Используя таблицу из Маркировка строк Пример:

ID наблюдения Есть крылья Есть морда Тип наблюдения
1 TRUE TRUE Птица
2 TRUE FALSE Самолёт
3 FALSE FALSE Супермен
4 FALSE TRUE Неизвестно

Выражение SQL CASE WHEN:

SELECT
    CASE WHEN "Есть крылья" = TRUE  AND "Есть морда" = TRUE  THEN "Птица"
         WHEN "Есть крылья" = TRUE  AND "Есть морда" = FALSE THEN "Самолёт"
         WHEN "Есть крылья" = FALSE AND "Есть морда" = TRUE  THEN "Супермен"
         ELSE "Неизвестно" END
FROM mystery_sightings

эквивалентно выражению case

case([Есть крылья] = TRUE  AND [Есть морда] = TRUE,  "Птица",
     [Есть крылья] = TRUE  AND [Есть морда] = FALSE, "Самолёт",
     [Есть крылья] = FALSE AND [Есть морда] = TRUE,  "Супермен", "Неизвестно")

Таблицы

Используя таблицу из Маркировка строк Пример:

ID наблюдения Есть крылья Есть морда Тип наблюдения
1 TRUE TRUE Птица
2 TRUE FALSE Самолёт
3 FALSE FALSE Супермен
4 FALSE TRUE Неизвестно

Формула таблицы

=IF(AND(B2 = TRUE, C2 = TRUE), "Птица",
    IF(AND(B2 = TRUE, C2 = FALSE), "Самолёт",
       IF(AND(B2 = FALSE, C2 = TRUE), "Супермен", "Неизвестно")
      )
    )

эквивалентно выражению case:

case([Есть крылья] = TRUE  AND [Есть морда] = TRUE,  "Птица",
     [Есть крылья] = TRUE  AND [Есть морда] = FALSE, "Самолёт",
     [Есть крылья] = FALSE AND [Есть морда] = TRUE,  "Супермен", "Неизвестно")

Python

Есть много способов реализовать условную логику с помощью Python. Мы рассмотрим подходы, которые имеет смысл преобразовывать в case-выражения Glarus BI.

Используя таблицу из Маркировка строк как пример (и предполагая, что он находится в кадре данных df):

ID наблюдения Есть крылья Есть морда Тип наблюдения
1 TRUE TRUE Птица
2 TRUE FALSE Самолёт
3 FALSE FALSE Супермен
4 FALSE TRUE Неизвестно

numpy select()

conditions = [
    (df["есть_крылья"] == True) & (df["есть_морда"] == True),
    (df["есть_крылья"] == True) & (df["есть_морда"] == False),
    (df["есть_крылья"] == False) & (df["есть_морда"] == True)]

outputs = ["Птица", "Самолёт", "Супермен"]

df["Тип наблюдения"] = np.select(conditions, outputs, default="Неизвестно")

Вспомогательная функция с pandas apply()

def Identify(df):
    if ((df["есть_крылья"] == True) & (df["есть_морда"] == True)):
        return "Bird"
    elif ((df["есть_крылья"] == True) & (df["есть_морда"] == False)):
        return "Plane"
    elif ((df["есть_крылья"] == False) & (df["есть_морда"] == True)):
        return "Супермен"
    else:
        return "Неизвестно"

df["Тип наблюдения"]= df.apply(Identify, axis=1)

Приведённые выше подходы эквивалентны выражению case, используемому для Тип наблюдения:

case([Есть крылья] = TRUE  AND [Есть морда] = TRUE,  "Птица",
     [Есть крылья] = TRUE  AND [Есть морда] = FALSE, "Самолёт",
     [Есть крылья] = FALSE AND [Есть морда] = TRUE,  "Супермен", "Неизвестно")

Дополнительная информация