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

case

case проверяет, соответствует ли значение списку условий, и возвращает выходные данные на основе первого выполненного условия. if и 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 TRUE Только доставка
4 FALSE FALSE Нет в наличии

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

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 TRUE Только доставка
4 FALSE FALSE Нет в наличии

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

SELECT
    CASE WHEN "На_витрине" = TRUE  AND "На_складе" = TRUE  THEN "Есть в наличии"
         WHEN "На_витрине" = TRUE  AND "На_складе" = FALSE THEN "Только самовывоз"
         WHEN "На_витрине" = FALSE AND "На_складе" = TRUE  THEN "Только доставка"
         ELSE "Нет в наличии" END
FROM product_status

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

case([На_витрине] = TRUE  AND [На_складе] = TRUE,  "Есть в наличии",
     [На_витрине] = TRUE  AND [На_складе] = FALSE, "Только самовывоз",
     [На_витрине] = FALSE AND [На_складе] = TRUE,  "Только доставка", "Нет в наличии")

Таблицы

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

ID На_витрине На_складе Вывод
1 TRUE TRUE Есть в наличии
2 TRUE FALSE Только самовывоз
3 FALSE TRUE Только доставка
4 FALSE FALSE Нет в наличии

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

=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 TRUE Только доставка
4 FALSE FALSE Нет в наличии

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 "Есть в наличии"
    elif ((df["на_витрине"] == True) & (df["на_складе"] == False)):
        return "Только самовывоз"
    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,  "Только доставка", "Нет в наличии")

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