Case

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

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

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

| Синтаксис | | ——————————————————————— | | case(condition1, output1, condition2, output2, ..., default_output) | | Возвращает результат первого выполненного условия. |

| Пример | | ———————————————————— | | case(isempty("glass half full"), "empty glass", isnull("glass half full"), "missing glass", "glass half full") | | “стакан наполовину полный” |

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

| Сумма | Диапазон | | —– | ——– | | 6 | 0-9 | | 18 | 10-19 | | 31 | 30-39 | | 57 | 50+ |

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

case([Amount] >= 0  AND [Amount] <=  9,  "0-9",
     [Amount] >= 10 AND [Amount] <= 19,  "10-19",
     [Amount] >= 20 AND [Amount] <= 29,  "20-29",
     [Amount] >= 30 AND [Amount] <= 39,  "30-39",
     [Amount] >= 40 AND [Amount] <= 49,  "40-49", "50+")

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

| ID прицеливания | Имеет крылья | Имеет морду | Тип прицеливания | | ————— | ———— | ———– | —————- | | 1 | Правда | Правда | Птица | | 2 | Правда | Ложь | Самолет | | 3 | Ложь | Ложь | Супермен | | 4 | Ложь | Правда | Неизвестно |

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

case([Has Wings] = TRUE  AND [Has Face] = TRUE,  "Bird",
     [Has Wings] = TRUE  AND [Has Face] = FALSE, "Plane",
     [Has Wings] = FALSE AND [Has Face] = TRUE,  "Superman"), "Unknown")

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

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

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

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

| ID заказа | Дата заказа | Статус | | ——— | ———– | ———- | | 1 | 2022-04-01 | Оплачено | | 1 | 2022-04-03 | Отправлено | | 2 | 2022-05-12 | Оплачено | | 2 | 2022-05-12 | Отменено |

  1. Создайте пользовательское выражение distinct(case([Статус] = "Отправлено", [ID заказа])) и назовите его “Всего отправлено заказов”.

  2. Выберите Дата заказа в качестве группы по столбцу.

  3. Нажмите Визуализировать, чтобы вернуть результат:

| Дата заказа | Всего заказов отправлено | | ———– | ———————— | | 2022-04-01 | 1 | | 2022-05-01 | 0 |

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

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

Ограничения

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

Избегать::

case(condition1, "string", condition2, TRUE, condition3, 1)

Делать::

case(condition1, "string", condition2, "TRUE", condition3, "1")

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

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

выражения в GlarusBI

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

Слияние

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

| Заметки | Комментарии | coalesce([Notes], [Comments] "No notes or comments.") | | ——————– | ———————— | ——————————————————- | | У меня есть заметка. | У меня есть комментарий. | У меня есть | | | У меня есть комментарий. | У меня есть комментарий. | | У меня есть заметка. | | У меня есть заметка. | | | | Нет заметок или комментариев. |

coalesce в выражениях GlarusBI

coalesce([Notes], [Comments] "No notes or comments.")

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

case(ISBLANK([Notes]) = FALSE AND ISBLANK([Comments]) = FALSE, [Notes],
     ISBLANK([Notes]) = TRUE  AND ISBLANK([Comments]) = False, [Comments],
     ISBLANK([Notes]) = FALSE AND ISBLANK([Comments]) = TRUE,  [Notes],
     ISBLANK([Notes]) = TRUE  AND ISBLANK([Comments]) = TRUE,  "No notes or comments")

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

Счет если

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

| ID заказа | Дата заказа | Status | | ——— | ———– | ———- | | 1 | 2022-04-01 | Оплачено | | 1 | 2022-04-03 | Отправлено | | 2 | 2022-05-12 | Оплачено | | 2 | 2022-05-12 | Отменено |

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

countif(case([Status] = "Shipped"))

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

count(case([Status] = "Shipped", [Row ID]))

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

Сумма если

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

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

выражение GlarusBI sumif

sumif([Amount], [Status] = "Shipped")

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

sum(case([Status] = "Shipped", [Amount]))

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

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

SQL

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

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

| ID прицеливания | Имеет крылья | Имеет морду | Тип прицеливания | | ————— | ———— | ———– | —————- | | 1 | Правда | Правда | Птица | | 2 | Правда | Ложь | Самолет | | 3 | Ложь | Ложь | Супермен | | 4 | Ложь | Правда | Неизвестно |

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

SELECT
    CASE WHEN "Has Wings" = TRUE  AND "Has Face" = TRUE  THEN "Bird"
         WHEN "Has Wings" = TRUE  AND "Has Face" = FALSE THEN "Plane"
         WHEN "Has Wings" = FALSE AND "Has Face" = TRUE  THEN "Superman"
         ELSE "Unknown" END
FROM mystery_sightings

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

case([Has Wings] = TRUE  AND [Has Face] = TRUE,  "Bird",
     [Has Wings] = TRUE  AND [Has Face] = FALSE, "Plane",
     [Has Wings] = FALSE AND [Has Face] = TRUE,  "Superman", "Unknown")

Таблицы

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

| Sighting ID | Has Wings | Has Face | Sighting Type | | ———– | ——— | ——– | ————- | | 1 | True | True | Bird | | 2 | True | False | Plane | | 3 | False | False | Superman | | 4 | False | True | Unknown |

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

=IF(AND(B2 = TRUE, C2 = TRUE), "Bird",
    IF(AND(B2 = TRUE, C2 = FALSE), "Plane",
       IF(AND(B2 = FALSE, C2 = TRUE), "Superman", "Unknown")
      )
    )

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

case([Has Wings] = TRUE  AND [Has Face] = TRUE,  "Bird",
     [Has Wings] = TRUE  AND [Has Face] = FALSE, "Plane",
     [Has Wings] = FALSE AND [Has Face] = TRUE,  "Superman", "Unknown")

Python

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

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

| Sighting ID | Has Wings | Has Face | Sighting Type | | ———– | ——— | ——– | ————- | | 1 | True | True | Bird | | 2 | True | False | Plane | | 3 | False | False | Superman | | 4 | False | True | Unknown |

numpy select()

conditions = [
    (df["has_wings"] == True) & (df["has_face"] == True),
    (df["has_wings"] == True) & (df["has_face"] == False),
    (df["has_wings"] == False) & (df["has_face"] == True)]

outputs = ["Bird", "Plane", "Superman"]

df["Sighting Type"] = np.select(conditions, outputs, default="Unknown")

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

def Identify(df):
    if ((df["has_wings"] == True) & (df["has_face"] == True)):
        return "Bird"
    elif ((df["has_wings"] == True) & (df["has_face"] == False)):
        return "Plane"
    elif ((df["has_wings"] == False) & (df["has_face"] == True)):
        return "Superman"
    else:
        return "Unknown"

df["Sighting Type"]= df.apply(Identify, axis=1)

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

case([Has Wings] = TRUE  AND [Has Face] = TRUE,  "Bird",
     [Has Wings] = TRUE  AND [Has Face] = FALSE, "Plane",
     [Has Wings] = FALSE AND [Has Face] = TRUE,  "Superman", "Unknown")

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