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

开发 前端
在刚进入 IT 行业的第一年换工作的时候,至今让我印象最深刻的有一个这样的面试题:如何通过 SQL 方式将数据库的行转列?

[[428802]]

本文转载自微信公众号「Java极客技术」,作者鸭血粉丝Tang 。转载本文请联系Java极客技术公众号。

一、提问环节

在刚进入 IT 行业的第一年换工作的时候,至今让我印象最深刻的有一个这样的面试题:如何通过 SQL 方式将数据库的行转列?

当时的面试官让我现场写 SQL,信心满满的我,我觉得我可以做出来,然后10分支、20分钟、30分钟...过去了,很遗憾一点动静都没有。

最后的我不得不服,结局相信大家也能猜到是啥了!??

二、场景分析

面试结束之后,不服输的我决定要把这个问题给破解掉,回到自己的租处之后,打开电脑,决定从0开始琢磨,怎么实现行转列呢?

其实如果你是一个经常玩 sql 的人,相信看到这个提问的时候,你心里已经有答案了,解决这个问题,方法其实很简单,通过下面这个语法即可实现。

  1. case  when ... then ... else ...  end 

例如下面是一张很常见的学生考试成绩表,我们将学生的考试成绩以单表的形式存储到数据库表中。

我们想要以下图形式,并以总分排名从高到底进行展示,如何通过 SQL 方式实现呢?

有的同学说,我可以通代码层面来实现,不可否认,代码完全可以实现,只需要封装一个如下形式的数据结构就可以了。

  1. //学生姓名为key,相同key的数据封装到List集合中 
  2. Map<String, List<StudentExam> studentExamMap = new HashMap(); 

其中学生姓名就是一个Key,然后把相同学生姓名的数据封装到List集合中,最后将学生姓名的总分合计起来,做一个排序,也可以实现。

在面对少量数据的时候,这种方式没问题,只是计算复杂了一点,但是当数据库表超过 5000 以上的时候,这种在代码层面的计算,内存就有点吃不消了,因此极其不推荐采用。

面对这种场景需求,我们多半会采用通过 sql 方式来解决,那么通过 sql 方式破解呢?请看下图

其中最关键的一步就是先用case when ... then ... else ... end语法将不同的课程分数分离出来,然后通过sum + group聚合函数查询进行分数汇总,最后通过order by语法将分数进行从高到低排序,进而达到我们想要的预期效果!

其实像这样的行转列的查询逻辑非常的普遍,例如刚过去的奥运奖牌排行榜!

还有全球新冠疫情数据排名。

可能不同的应用实现方式不一样,但是大体的解决思路是一样的,将数据进行分组聚合汇总,然后按照分数进行从高到低排名。

通过 SQL 实现还有一个非常大的好处,就是可以根据不同的维度进行排序,同时支持多个字段进行排序,如果在代码层面去实现排序,相当复杂。

三、小结

本文主要围绕如何通过 sql 的方式,将数据库表中的行转列进行显示,希望能帮助到大家!

 

责任编辑:武晓燕 来源: Java极客技术
相关推荐

2022-09-29 07:30:57

数据库索引字段

2021-12-08 06:53:29

面试动态代理

2020-08-06 07:49:57

List元素集合

2021-07-06 07:08:18

管控数据数仓

2021-12-16 22:59:21

SQL报表应用

2020-11-11 10:05:04

数据库分库分表美团面试

2010-07-13 16:20:30

SQL Server数

2024-09-19 08:10:54

2020-08-17 07:40:19

消息队列

2020-09-24 06:39:58

MySQL数据库

2015-08-13 10:29:12

面试面试官

2022-03-30 07:28:24

MySQL数据库ACID

2024-10-16 21:17:59

2023-02-16 08:10:40

死锁线程

2024-03-12 14:36:44

微服务HTTPRPC

2020-10-15 06:26:24

高并发场景冰河

2024-02-26 14:07:18

2019-08-07 09:52:34

数据库MySQLSQL

2024-03-18 14:06:00

停机Spring服务器

2024-02-20 14:10:55

系统缓存冗余
点赞
收藏

51CTO技术栈公众号