案例
case
(別名 if
) 檢查值是否符合條件列表,並根據符合的第一個條件傳回一些輸出。if
和 case
的運作方式完全相同。
您可以選擇性地告知 case
,如果沒有符合任何條件,則傳回預設輸出。如果您未設定預設輸出,case
將在檢查完所有條件後傳回 null
(null
值在 Metabase 中顯示為空白值)。
當您需要執行以下操作時,請使用 case
表達式
語法 |
---|
case(condition1, output1, condition2, output2, ..., default_output) |
從符合的第一個條件傳回輸出。 |
範例 |
---|
case(isempty("glass half full"), "空杯", isnull("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 | 已取消 |
- 建立自訂表達式
distinct(case([Status] = "Shipped", [Order ID]))
並將其命名為「已出貨訂單總數」。 - 選擇「訂單日期」作為分組依據欄位。
- 按一下「視覺化」以傳回結果
訂單日期 | 已出貨訂單總數 |
---|---|
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
表達式互換使用的函數和公式,並附註關於如何為您的使用案例選擇最佳選項。
其他工具
Coalesce
使用來自 Coalesce:合併值 範例的表格
註解 | 註解 | coalesce([Notes], [Comments] "沒有註解或評論。") |
---|---|---|
我有一個註解。 | 我有一個評論。 | 我有一個註解。 |
我有一個評論。 | 我有一個評論。 | |
我有一個註解。 | 我有一個註解。 | |
沒有註解或評論。 |
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
。
Countif
使用來自 彙總資料 範例的表格
訂單 ID | 訂單日期 | 狀態 |
---|---|---|
1 | 2022-04-01 | 已付款 |
1 | 2022-04-03 | 已出貨 |
2 | 2022-05-12 | 已付款 |
2 | 2022-05-12 | 已取消 |
countif(case([Status] = "Shipped"))
等同於 case
表達式
count(case([Status] = "Shipped", [Row ID]))
當您計算符合條件的表格中所有資料列時,countif
等同於 case
。如果您想計算符合條件的唯一資料列,則不等同。
Sumif
使用來自 彙總資料 範例的擴充版本表格
資料列 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 |
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 文件。