Case

case(别名 if)检查一个值是否与条件列表匹配,并根据第一个满足条件的条件返回一些输出。ifcase 的工作方式完全相同。

您可以选择告诉 case,如果所有条件都不满足,则返回一个默认输出。如果您不设置默认输出,case 在检查完所有条件后将返回 nullnull 值在 Metabase 中显示为空白值)。

当您需要执行以下操作时,请使用 case 表达式:

语法
case(条件1, 输出1, 条件2, 输出2, ..., 默认输出)
返回第一个满足条件的输出。
示例
case(isempty("半满的杯子"), "空杯子", isNull("半满的杯子"), "没有杯子", "半满的杯子")
“半满的杯子”

用于频率表或直方图的数据分组

金额
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([Status] = "Shipped", [Order 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")

本节介绍可与 Metabase case 表达式互换使用的函数和公式,并附有关于如何为您的用例选择最佳选项的说明。

Metabase 表达式

其他工具

合并

使用来自合并:合并不同列中的值示例的表格

笔记 评论 coalesce([备注], [评论] "没有备注或评论。")
我有一个备注。 我有一条评论。 我有一个备注。
  我有一条评论。 我有一条评论。
我有一个备注。   我有一个备注。
    没有备注或评论。

Metabase coalesce 表达式

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

计数(如果)

使用来自聚合数据示例的表格

订单 ID 订单日期 状态
1 2022-04-01 已付款
1 2022-04-03 已发货
2 2022-05-12 已付款
2 2022-05-12 已取消

Metabase 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

Metabase sumif 表达式

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

等同于 case 表达式

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

当您对单个条件下的单个列求和时,sumif 等同于 case

如果您想在第二个独立条件下对第二个列求和,则应使用 case。例如,如果您想在 **状态** = “已发货”时对 **金额** 列求和,并在 **状态** = “已退款”时对另一个(假设的)列(如 **已退款金额**)求和。

SQL

在大多数情况下(除非您使用 NoSQL 数据库),从笔记本编辑器创建的问题都会转换为针对您的数据库或数据仓库运行的 SQL 查询。Metabase case 表达式将转换为 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")

例如,这个SQL 技巧,用于排序条形图可以使用 Metabase case 表达式代替。

电子表格

使用来自标记行示例的表格

目击 ID 有翅膀 有脸 目击类型
1
2 飞机
3 超人
4 未知

电子表格公式

=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 实现条件逻辑。我们将介绍可以转换为 Metabase case 表达式的方法。

使用来自标记行示例的表格(并假设它在一个名为 df 的数据框中)

目击 ID 有翅膀 有脸 目击类型
1
2 飞机
3 超人
4 未知

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")

延伸阅读

阅读其他版本的 Metabase 的文档。

这有帮助吗?

感谢您的反馈!
想改进这些文档吗? 建议修改。
© . This site is unofficial and not affiliated with Metabase, Inc.