如果您需要根據(jù)其他單元格有條件地向單元格添加值,則將使用 SQL 的 case 語句。如果您了解其他語言,則 SQL 中的 case 語句類似于 if 語句或 switch 語句。它允許您有條件地指定一個(gè)值,以便根據(jù)滿足的條件,在單元格中獲得不同的值。這在數(shù)據(jù)分析中非常重要,因此在介紹案例陳述之后,我們將看到幾個(gè)示例,說明如何使用它以簡單的方式分析數(shù)據(jù)。
SQL Case 語句語法
語法中有很多東西,但它仍然相當(dāng)直觀:關(guān)鍵字CASE表示 case 語句的開始,關(guān)鍵字END表示它的結(jié)束。
然后對于單個(gè)條件,您可以編寫關(guān)鍵字,WHEN后跟必須滿足的條件。之后是THEN該條件的關(guān)鍵字和值,例如WHEN <condition> THEN <stuff>.
然后可以跟其他WHEN/THEN語句。
最后,如果ELSE 關(guān)鍵字的所有條件都不為真,您可以添加一個(gè)默認(rèn)使用的值,如下所示。
CASE
WHEN condition1 THEN stuff
WHEN condition2 THEN other stuff
...
ELSE default stuff
END
讓我們把它付諸實(shí)踐以更好地理解它。
SQL Case 語句示例
讓我們CASE在示例中使用該語句。我們有一個(gè)表格,上面列出了學(xué)生及其考試成績。我們需要給每個(gè)學(xué)生打分,我們可以使用case語句自動完成。
ID | 姓名 | 分?jǐn)?shù) |
---|---|---|
1 | 西米索拉 | 60 |
2 | 伊萬 | 80 |
3 | 梅托迪亞 | 52 |
4 | 卡勒姆 | 98 |
5 | 萊婭 | 84 |
6 | 阿帕雷西達(dá) | 82 |
7 | 烏蘇拉 | 69 |
8 | 齋月 | 78 |
9 | 電暈 | 87 |
10 | 愛麗絲 | 57 |
11 | 凱蘭崔爾 | 89 |
12 | 梅雷爾 | 99 |
13 | 雪莉絲 | 55 |
14 | 尼提亞 | 81 |
15 | 埃爾薩德 | 71 |
16 | 利斯 | 90 |
17 | 約翰娜 | 90 |
18 | 安菲薩 | 90 |
19 | 涼介 | 97 |
20 | 沙猜 | 61 |
21 | 埃爾伯特 | 63 |
22 | 凱特琳 | 51 |
我們可以使用該CASE語句給每個(gè)學(xué)生一個(gè)成績,我們將在名為 的新列中添加該成績grade。
讓我們先寫下CASE陳述,我們將在其中寫出每個(gè)年級的細(xì)目分類。當(dāng)score為 94 或更高時(shí),該行的值為A。如果分?jǐn)?shù)為 90 或更高,則值為A-,依此類推。
CASE
WHEN score >= 94 THEN "A"
WHEN score >= 90 THEN "A-"
WHEN score >= 87 THEN "B+"
WHEN score >= 83 THEN "B"
WHEN score >= 80 THEN "B-"
WHEN score >= 77 THEN "C+"
WHEN score >= 73 THEN "C"
WHEN score >= 70 THEN "C-"
WHEN score >= 67 THEN "D+"
WHEN score >= 60 THEN "D"
ELSE "F"
END
編寫CASE語句后,我們將把它添加到查詢中。然后我們將grade使用AS關(guān)鍵字為列命名:
SELECT *,
CASE
WHEN score >= 94 THEN "A"
WHEN score >= 90 THEN "A-"
WHEN score >= 87 THEN "B+"
WHEN score >= 83 THEN "B"
WHEN score >= 80 THEN "B-"
WHEN score >= 77 THEN "C+"
WHEN score >= 73 THEN "C"
WHEN score >= 70 THEN "C-"
WHEN score >= 67 THEN "D+"
WHEN score >= 60 THEN "D"
ELSE "F"
END AS grade
FROM students_grades;
我們從這個(gè)查詢中得到的表格如下所示——現(xiàn)在每個(gè)學(xué)生都有一個(gè)基于他們的分?jǐn)?shù)的成績。
ID | 姓名 | 分?jǐn)?shù) | 年級 |
---|---|---|---|
1 | 西米索拉 | 60 | D |
2 | 伊萬 | 80 | 乙- |
3 | 梅托迪亞 | 52 | F |
4 | 卡勒姆 | 98 | 一種 |
5 | 萊婭 | 84 | 乙 |
6 | 阿帕雷西達(dá) | 82 | 乙- |
7 | 烏蘇拉 | 69 | D+ |
8 | 齋月 | 78 | C+ |
9 | 電暈 | 87 | 乙+ |
10 | 愛麗絲 | 57 | F |
11 | 凱蘭崔爾 | 89 | 乙+ |
12 | 梅雷爾 | 99 | 一種 |
13 | 雪莉絲 | 55 | F |
14 | 尼提亞 | 81 | 乙- |
15 | 埃爾薩德 | 71 | C- |
16 | 利斯 | 90 | 一種- |
17 | 約翰娜 | 90 | 一種- |
18 | 安菲薩 | 90 | 一種- |
19 | 涼介 | 97 | 一種 |
20 | 沙猜 | 61 | D |
21 | 埃爾伯特 | 63 | D |
22 | 凱特琳 | 51 | F |
更復(fù)雜的 Case 語句示例
我們還可以根據(jù)需要使用除 case 語句之外的其他語句以不同方式操作表。
案例陳述示例 1
例如,我們可以使用ORDER BY對行進(jìn)行排序以將最高分排在最前面。
SELECT name,
CASE
WHEN score >= 94 THEN "A"
WHEN score >= 90 THEN "A-"
WHEN score >= 87 THEN "B+"
WHEN score >= 83 THEN "B"
WHEN score >= 80 THEN "B-"
WHEN score >= 77 THEN "C+"
WHEN score >= 73 THEN "C"
WHEN score >= 70 THEN "C-"
WHEN score >= 67 THEN "D+"
WHEN score >= 60 THEN "D"
ELSE "F"
END AS grade
FROM students_grades
ORDER BY score DESC;
我們根據(jù)score哪個(gè)是數(shù)字而不是grade列進(jìn)行排序,因?yàn)樽帜疙樞蚺c基于值的等級順序不同。我們使用DESC關(guān)鍵字以降序呈現(xiàn)它,最高值在頂部。
我們得到的表格如下所示:
姓名 | 年級 |
---|---|
梅雷爾 | 一種 |
卡勒姆 | 一種 |
涼介 | 一種 |
利斯 | 一種- |
約翰娜 | 一種- |
安菲薩 | 一種- |
凱蘭崔爾 | 乙+ |
電暈 | 乙+ |
萊婭 | 乙 |
阿帕雷西達(dá) | 乙- |
尼提亞 | 乙- |
伊萬 | 乙- |
齋月 | C+ |
埃爾薩德 | C- |
烏蘇拉 | D+ |
埃爾伯特 | D |
沙猜 | D |
西米索拉 | D |
愛麗絲 | F |
雪莉絲 | F |
梅托迪亞 | F |
凱特琳 | F |
Case 語句示例 2
讓我們對這些數(shù)據(jù)做一些分析。我們可以使用GROUP BY并COUNT計(jì)算每個(gè)年級收到多少學(xué)生。
SELECT
CASE
WHEN score >= 94
THEN "A"
WHEN score >= 90 THEN "A-"
WHEN score >= 87 THEN "B+"
WHEN score >= 83 THEN "B"
WHEN score >= 80 THEN "B-"
WHEN score >= 77 THEN "C+"
WHEN score >= 73 THEN "C"
WHEN score >= 70 THEN "C-"
WHEN score >= 67 THEN "D+"
WHEN score >= 60 THEN "D"
ELSE "F"
END AS grade,
COUNT(*) AS number_of_students
FROM students_grades
GROUP BY grade
ORDER BY score DESC;
我們使用ORDER BY從高到低的順序?qū)Φ燃夁M(jìn)行排序,我們使用score它是一個(gè)數(shù)值(因?yàn)榘磄rade列排序?qū)⑹褂米帜疙樞?,這與按等級的值排序不同)。
年級 | NUMBER_OF_STUDENTS |
---|---|
一種 | 3 |
一種- | 3 |
乙+ | 2 |
乙 | 1 |
乙- | 3 |
C+ | 1 |
C- | 1 |
D+ | 1 |
D | 3 |
F | 4 |
案例陳述示例 3
讓我們對這些數(shù)據(jù)做一些不同的分析。我們可以使用GROUP BYandCOUNT和一個(gè)不同的 case 語句來計(jì)算有多少學(xué)生通過了考試。然后我們可以使用ORDER BY我們喜歡的順序排列列,通過頂部的學(xué)生人數(shù)。
SELECT
CASE
WHEN score >= 60
THEN "passed"
ELSE "failed"
END AS result,
COUNT(*) AS number_of_students
FROM students_grades
GROUP BY result
ORDER BY result DESC;
我們得到的表格如下所示。班級的表現(xiàn)還不錯,22 名學(xué)生中有 18 名學(xué)生通過了成績——但其他 4 名學(xué)生可能需要一些幫助。
結(jié)果 | NUMBER_OF_STUDENTS |
---|---|
通過 | 18 |
失敗的 | 4 |
結(jié)論
case 語句是一個(gè)強(qiáng)大的工具,當(dāng)您需要根據(jù)特定條件獲取值時(shí),您可以使用它。
在本文中,您已經(jīng)學(xué)習(xí)了如何使用它,并且您已經(jīng)看到了一些關(guān)于如何將其用于數(shù)據(jù)分析的示例。