CASE WHEN 究竟有多强悍
- 2020 年 1 月 2 日
- 筆記
本文标识 : MQ0015
本文编辑 : 长安月下赏美人儿
编程工具 : MySQL、DBeaver
阅读时长 : 5分钟
有关 CASE WHEN
很多小伙伴儿对 EXCEL 中的数据透视表,应该都不陌生。而本文的 CASE WHEN 语句,就相当于一个自定义的数据透视表。GROUP BY 后面的字段相当于行名,CASE WHEN 则负责列名的构建。
CASE WHEN 的分类
通过这段时间的学习,发现了一个比较有趣的现象,那就是但凡比较厉害的函数,都会有分类诶!
1、CASE WHEN 简单函数
#简单函数基础语法 CASE <字段> WHEN <表达式> THEN <表达式> WHEN <表达式> THEN <表达式> ...... ELSE<表达式> END
#简单函数举例: SELECT class ,CASE class WHEN 'A' THEN '一班' WHEN 'B' THEN '二班' ELSE '其他' END AS class_name FROM test_table1;
数据结果:

2、CASE WHEN 搜索函数
#搜索函数基础语法 CASE WHEN <求值表达式> THEN <表达式> WHEN <求值表达式> THEN <表达式> ...... ELSE<表达式> END
CASE WHEN 搜索函数实例操作
例子:新人小美成为一名小白数据分析员,取数是其基础工作,但是面对一个如此凌乱的数据表,小美该如何迅速获取各班级分别有男生女生各多少人数据呢?
凌乱数据展示:

解决问题的方式一:
根据小美目前知识储备量,进行流程梳理,
结果字段:class_name、gender、stu_num
获取过程:先查询男生数量,再查询女生数量,然后进行列拼接
知识点:子查询、内连接
SELECT M.class ,M.stu_num_M ,F.stu_num_F FROM (SELECT class ,SUM(stu_num) AS stu_num_M FROM test_table1 WHERE gender='男' GROUP BY class) AS M INNER JOIN (SELECT class ,SUM(stu_num) AS stu_num_F FROM test_table1 WHERE gender='女' GROUP BY class)AS F ON M.class=F.class ORDER by class;
数据结果:

解决问题的方式二:
各种别名,子查询,内连接,小美用尽了毕生绝学,但是有没有更简单的一些方法,如果遇到获取更多的字段,来自更多的表,该如何进行操作?毕竟时间效率真的很重要!故查看小伙伴之前的代码,然后发现了 CASE WHEN 的用法,于是进行了尝试!
SELECT class ,SUM(CASE WHEN gender='男' THEN stu_num ELSE 0 END) AS stu_num_M ,SUM(CASE WHEN gender='女' THEN stu_num ELSE 0 END) AS stu_num_F FROM test_table1 GROUP BY class;
数据结果:

两种不同的解决方式,得到了相同的结果,但是代码对比一目了然!后者更清爽简洁。所以,解决问题的方式有很多种,虽说条条大路通罗马,但时间的限制或个人的不同思考方式,何不选择更加便捷的那条路线呢。
CASE WHEN 小结:
- case 搜索函数包含 case 简单函数的功能
- case 简单函数 when 后面跟随的是表达式
- case 搜索函数 when 后面跟随的是求值表达式
- case 搜索函数中求值表达式可以不同
- then 后面的值与 else 后面的值类型要一致,否则会报错
- 简单函数case 后面会跟随字段,而搜索函数却没有
注意:关于最后一条小结,有待实践继续检验!!!