欢迎查看微信公众号原文链接
在日常工作中,或者面试过程中,常常会碰到要求用SQL语句实现行转列。形式如下:
select * from test;
而面试官要求查询结果如下展示:
或者这样:
其实很简单~我们可以使用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;
很明显,我们需要以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;
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替换,不再赘述!
很明显,结果需要去重!但是,在实际的生产过程中不需要去重,而且不是重复的,这个谜题留给大家思考!
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;
通过上面的比较发现,不同情况使用不同的语句为好。如果你想查询更多字段,那么窗口函数不失为一种选择;如果只需要查询一个字段,如name,那么建议大家还是使用groupby为好。在实际生产中,查询字段远远不止一个,一般不会重复,所以也就不需要去重了。感谢你们来看我!缘分~
作者严小样儿,一位成功转行数据分析的诗人。特别用心地将转行心路历程,面试成功经验写成了公众号文章,多位迷茫的小白、转行的萌新看了后直言收获满满。[ 统计与数据分析实战 ]基于Python、R语言、SQL,运用统计学知识,手把手带领读者进行数据分析实战。”转行数分,关注我就会特别简单~“