当前位置: 首页 > 科技观察

面试官问:如何通过SQL将数据库表行转列?

时间:2023-03-21 18:50:13 科技观察

本文转载自微信公众号《Java极客技术》,作者鸭血范唐。转载本文请联系Java极客技术公众号。一、提问环节在我进入IT行业第一年跳槽的时候,至今给我印象最深的面试题是:如何通过SQL将数据库的行进行转换?当时面试官让我WritingSQL,我信心满满,我觉得我能搞定,然后10个分支,20分钟,30分钟……就过去了,可惜一点动静都没有。不得不接受最后一个,相信大家也能猜到结局是什么!,决定从0开始思考,如何实现行到列的转换?其实如果你是一个经常玩sql的人,相信看到这道题的时候,你心里已经有了答案。解决这个问题的方法其实很简单。通过下面的语法可以实现。casewhen...then...else...end例如,下面是一张很常见的学生考试成绩表。我们将学生的考试成绩以单表的形式存储在数据库表中。我们希望有如下的图形形式,并以总分排名从高到低的方式展示。如何通过SQL实现呢?有同学说我可以通过代码层面来实现。不可否认代码是完全可以实现的,只需要封装一个如下形式的数据结构就足够了。//学生姓名为key,相同key的数据封装到List集合中MapstudentExamMap=newHashMap();其中学生姓名是一个Key,然后将同一个学生姓名的数据封装到List集合中,最后将学生姓名的总分相加并进行排序,也可以实现。面对少量数据时,这种方法还好,但计算稍微复杂一点,但当数据库表超过5000时,代码层面的计算对内存来说有点吃不消,所以极不建议。面对这种场景的需求,我们大部分人都会使用sql方式来解决,那么sql方式呢?请看下图,最关键的一步是用casewhen...then...else...end语法将不同课程的分数分开,然后通过sum+group聚合函数查询聚合分数,最后通过orderbysyntax将分数从高到低排序,从而达到我们想要的预期效果!其实像这样的行转列的查询逻辑是很常见的,比如刚刚过去的奥运会奖牌排行榜!还有全球新冠疫情数据排名。不同的应用程序可能有不同的实现方法,但总体解决方案是相同的。将数据分组聚合,然后按照分数从高到低进行排序。实现SQL还有一个很大的好处,就是可以按照不同的维度进行排序,支持多字段排序。在代码层面实现排序是相当复杂的。3.小结本文主要讲述如何通过sql将数据库表中的行转换为列进行显示。希望能帮到大家!