sql小技巧之case when

博主目前大三,大数据专业,没有选择pythno和java,选择了sql。先从数仓学起,工作了再去学习java或者python

关于case when 你不知道的事情
  从数仓最基本的sql开始,到最后的项目,都会在这个博客里面进行更新。
  对于一个sql小白来说,可能感觉case when 不是特别的有用。但是对于我这种sql小老菜来说,case when可以发挥着各种作用。说句题外话,数仓应该是主hsql的,但是目前博主家里超级冷,没有暖气所以不想打开虚拟机去运行集群。就用mysql来讲一讲这些基本的sql语句。
注意事项:
  1.case when 要统一各个分支返回的数据类型,不能第一行返回int,第二行返回字符串。这样是会报错的。
  2.不要忘记写end,如果不写就会直接报错
  3.养成写else的习惯,如果case when then else中我们不写else子句,那么就会默认返回null。尽管我们知道返回的是Null,我们也要写上,这样我们一看就知道返回的是null。
case when用处1:
  我们这里有一些数据,关于日本一些人口的数据,虽然这个表不严谨,但是却能够通俗易懂的向我们展示case when的强大之处。

  将处在同一区域的分为一组,并且按找区域总人口的数量。
解析:case when 先将处在同一区域的县名进行处理,然后根据县名sum()求和

select case pref_name 
	when "德岛" then "四国"
	when "香川" then "四国"
	when "爱媛" then "四国"
	when "高知" then "四国"
	when "福冈" then "九州"
	when "佐贺" then "九州"
	when "长崎" then "九州"
	else "其它"  end ,
	sum(population)
from poptbl
group by case pref_name 
	when "德岛" then "四国"
	when "香川" then "四国"
	when "爱媛" then "四国"
	when "高知" then "四国"
	when "福冈" then "九州"
	when "佐贺" then "九州"
	when "长崎" then "九州"	
	else "其它"  end;

  刚开始的时候,我并没有想到要这样去写,我的思路是两个sql语句来实现。第一个语句用来将县名转换成区域名字,第二部用区域名字来进行分组求和。虽然整体上意思一样,但是上面这个只用了一个sql语句。
可能会有小菜鸟问了,为什么这样可以查询出来,在Hive中的话,可以explain + sql语句来看这个sql语句的执行过程,分为map 和 reduce都有执行计划树。其实在sum中,就自动有group by分组了。
  先说一下上面这个sql的执行顺序: from group by select (通过hive sql语句的执行计划树可以看出来。在执行计划树里面,就有着执行语句的顺序,首先是从哪个表,然后就会有map ,map下面就会有 group by,分组下面会显示根据哪一个字段分的组。reduce 里面会进行sum求和)
case when根据条件分组:
  其实呢,case when最为出色还是在条件分组里面,在刚开始的时候,博主并不知道还有sum(case when )这种骚操作,当时还是在大二下期,暑假在家里刷牛客网的sql题目。偶然间看到了一道题目,在下面寻找解法的时候发现了这个sum(case when)。当时博主还很垃圾,在网上找了半天才知道这种操作还有他的意思。意思就是每次都会将一个列的数据进行判断case when,如果符合了我们就执行then 里面的东西,不行的话就去执行else里面的东西,最后通过sum进行聚合、下面就让我们看看一道题目,给出一些日本的数据,求每个县里面的男生和女生的数量。
原表如下

  其中1表示男生,2表示女生。求出每个县里面男生和女生的数量。就是下面这个表

解法一:
  分别求出男生和女生的数量,分组聚合求出各个性别的总合
  将这两个结果union
虽然思路是这样的,但是博主在进行Union的时候,并不是博主想象的那样,mysql将求出来的结果进行了合并,将男生和女生的数量绘制到一个列上面。

select pref_name,sum(population) as 男生数量
	from PopTbl2
	where sex = "1"
	group by pref_name
	union 
	select pref_name,sum(population) as 女生数量
	from PopTbl2
	where sex ='2'
	group by pref_name

  但是,当博主发现这个问题的时候,以为是因为我们的pref_name都相同,他就把我们的男生和女生的结果放在一个列里面。于是,博主删除了sql语句中第二个表里面的pref_name字段,结果报了错误,报错说Union的行和列并不匹配。不知道观众老爷发现没有,union之后的数据,就是原表的数据,只不过少了一行sex。后来博主百度了一下,union就是将男生和女生的数据合并起来,其实并不是这个语句不对,只是目前的方法不对。所以,介绍一个主角 case when

select pref_name,
	sum(case when sex = "1" then population else 0 end ) as 男生数量,
	sum(case when sex = "2" then population else 0 end ) as 女生数量
	from PopTbl2
	group by pref_name

  通过简简单单的几行,case when判断sex这一列是男的还是女生,判断完之后用sum和geoup by 进行分组聚合。
不知道大家发现了没有,通过case when我们将表的结果转换为了二维表的格式,如果只是简单的group by 他就会积压到一列。从上面的执行结果来看,此时的输出已经是县名,男生数量,女生数量

总结:!!!
  新手用where子句进行条件分支,高手用select子句进行条件分支
为什么用绿色的呢?因为绿色是某人喜欢的颜色😏

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值