CASE WHEN 究竟有多强悍

本文标识 : 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 后面会跟随字段,而搜索函数却没有

注意:关于最后一条小结,有待实践继续检验!!!