MySQL实现对查询结果的行转列操作

欢迎查看微信公众号原文链接

在日常工作中,或者面试过程中,常常会碰到要求用SQL语句实现行转列。形式如下:

 select * from test;

MySQL实现对查询结果的行转列操作_第1张图片
而面试官要求查询结果如下展示:
MySQL实现对查询结果的行转列操作_第2张图片
或者这样:
MySQL实现对查询结果的行转列操作_第3张图片
其实很简单~我们可以使用case when语句进行行转列操作。代码如下:
case1:

select  name,max(case when subject='语文' then score else 0  end) as 语文 ,max(case when subject='数学' then  score else 0 end) as 数学, max(case when subject='英语' then score else 0  end) as 英语 from test group by name;

case2:

select  name,sum(case when subject='语文' then score else 0  end) as 语文 ,sum(case when subject='数学' then  score else 0 end) as 数学, sum(case when subject='英语' then score else 0  end) as 英语 from test group by name;

以上两种代码都可以实现行转列,细心的同学可能会发现其实只有max和sum的区别。其实,max、sum最主要的用途就是聚合作用——以name分组聚合。为了让大家更好的理解sum或max的作用,我们先展现一下不加聚合函数的效果。

select  name,case when subject='语文' then score else 0  end as 语文 ,case when subject='数学' then  score else 0 end as 数学, case when subject='英语' then score else 0  end as 英语 from test;

MySQL实现对查询结果的行转列操作_第4张图片
很明显,我们需要以name进行分组聚合,这样才能得到满足条件格式的输出。而用max还是sum进行聚合,没有任何区别。

select  name,max(case when subject='语文' then score else 0  end) as 语文 ,max(case when subject='数学' then  score else 0 end) as 数学, max(case when subject='英语' then score else 0  end) as 英语,sum(score) as 总分 from test group by name;

MySQL实现对查询结果的行转列操作_第5张图片
同时,再给大家介绍一下以窗口函数进行聚合的案例。代码如下:

select name,max(case when subject='语文' then score else 0 end) over( partition by name) 语文,
	max(case when subject='数学' then score else 0 end) over(partition by name) 数学,
		max(case when subject='英语' then score else 0 end) over(partition by name) 英语 from test;

同理,上面的max也可以用sum替换,不再赘述!
MySQL实现对查询结果的行转列操作_第6张图片
很明显,结果需要去重!但是,在实际的生产过程中不需要去重,而且不是重复的,这个谜题留给大家思考!

select distinct
 name,sum(case when subject='语文' then score else 0 end) over( partition by name) 语文,
	sum(case when subject='数学' then score else 0 end) over(partition by name) 数学,
		sum(case when subject='英语' then score else 0 end) over(partition by name) 英语 from test;

MySQL实现对查询结果的行转列操作_第7张图片
通过上面的比较发现,不同情况使用不同的语句为好。如果你想查询更多字段,那么窗口函数不失为一种选择;如果只需要查询一个字段,如name,那么建议大家还是使用groupby为好。在实际生产中,查询字段远远不止一个,一般不会重复,所以也就不需要去重了。感谢你们来看我!缘分~

作者严小样儿,一位成功转行数据分析的诗人。特别用心地将转行心路历程,面试成功经验写成了公众号文章,多位迷茫的小白、转行的萌新看了后直言收获满满。[ 统计与数据分析实战 ]基于Python、R语言、SQL,运用统计学知识,手把手带领读者进行数据分析实战。”转行数分,关注我就会特别简单~“

MySQL实现对查询结果的行转列操作_第8张图片

你可能感兴趣的:(数据库操作,数据分析,面试)