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 | Отменён |
- Создайте пользовательское выражение
distinct(case([Статус] = "Отправлен", [ID заказа]))
и назовите его "Всего отправленных заказов". - Выберите Дата заказа в качестве группы по столбцу.
- Нажмите Визуализировать, чтобы вернуть результат:
Дата заказа | Всего отправленных заказов |
---|---|
2025-04-01 | 1 |
2025-05-01 | 0 |
Допустимые типы данных¶
Тип данных | Работает с case |
---|---|
Строка | ✅ |
Число | ✅ |
Время | ✅ |
Условие | ✅ |
JSON | ❌ |
Информация о типах данных приведена в разделе обучения руководства Metabase (англ.).
Ограничения¶
Все выходные данные должны иметь одинаковый тип данных.
Избегайте:
Делайте:
Связанные функции¶
В этом разделе рассматриваются функции и формулы, которые можно использовать взаимозаменяемо с выражением case
в Glarus BI, с примечаниями о том, как выбрать лучший вариант для вашего варианта использования.
Другие инструменты
coalesce¶
Используем таблицу из Слияние: консолидация значений. Пример:
Заметки | Комментарии | coalesce([Заметки], [Комментарии] "Нет заметок или комментариев.") |
---|---|---|
У меня есть заметка. | У меня есть комментарий. | У меня есть заметка. |
У меня есть комментарий. | У меня есть комментарий. | |
У меня есть заметка. | У меня есть заметка. | |
Нет заметок или комментариев. |
coalesce
в выражениях Glarus BI
идентично выражению 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
идентично выражению case
:
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 |
идентично выражению case
:
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, "Супермен", "Неизвестно")