case when有两个用法,一个是行转列,一个是更改列的值
在数据分析时经常要用到行转列,此时如果使用case when就会方便很多,case when的熟练使用程度,可以说的判断对SQL操作水平的评定方法之一。
case when的语句在某种程度上可以理解成是if函数的简便逻辑写法,主要有两种模式:
模式一(简单变量表达式):
case <表达式(变量)>
when <表达式1(变量的值)> then <表达式1(符合变量值的结果)>
when <表达式2(变量的值)> then <表达式2(符合变量值的结果)>
when <表达式3(变量的值)> then <表达式3(符合变量值的结果)>
...
else <表达式(符合变量值的结果)>
end
模式二(搜索变量表达式):
case
when <求值表达式1(一般是判断)> then <表达式1(符合变量值的结果)>
when <求值表达式2(一般是判断)> then <表达式2(符合变量值的结果)>
when <求值表达式3(一般是判断)> then <表达式3(符合变量值的结果)>
...
else <表达式(符合变量值的结果)>
end
通常情况下,模式二的方式会更加灵活,在工作中也推荐使用模式二的写法(特别是如果有使用Tableau等软件制作参数的时候,语法跟模式二的相同的)。
看具体的例子:
如果现在想要看不同学生的平均分和每个课程的成绩,并且不同课程按列进行显示,要怎么操作呢?
这个时候,使用case when就很方便了
SELECT
st.s_id'学号'
,st.s_name'姓名'
,SUM(CASE WHEN c.c_name='语文' THEN sc.s_score else null end)语文
,SUM(CASE WHEN c.c_name='数学' THEN sc.s_score else null end)数学
,SUM(CASE WHEN c.c_name='英语' THEN sc.s_score else null end)英语
,AVG(sc.s_score)平均分
-- 使用SUM是为了提取聚合值(case when之后的值是多个,但是又很多空值,使用聚合函数提取一个值)
FROM student as st
INNER JOIN score as sc ON st.s_id=sc.s_id
INNER JOIN course as c ON sc.c_id=c.c_id
GROUP BY st.s_id,st.s_name
ORDER BY AVG(sc.s_score) DESC
-- 这个是数据库多个表连接,并按照平均值降序排列
当然了,也可以使用case when对学生的成绩进行优良中差的判断,这个在工作中的使用场景也是蛮多的,如果有兴趣的同学可以自己试着练习看看。
更改列值:
SELECT
s_id
,c_id
,(case when s_score>=90 then '优秀'
when s_score>=80 then '良好'
when s_score>=70 then '一般'
when s_score>=60 then '及格'
when s_score<60 then '不及格'
end)成绩
FROM score
这个就是case when在MySQL中的常用用法。