成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官提問:如何通過SQL方式將數(shù)據(jù)庫表行轉(zhuǎn)列?

開發(fā) 前端
在剛進(jìn)入 IT 行業(yè)的第一年換工作的時候,至今讓我印象最深刻的有一個這樣的面試題:如何通過 SQL 方式將數(shù)據(jù)庫的行轉(zhuǎn)列?

[[428802]]

本文轉(zhuǎn)載自微信公眾號「Java極客技術(shù)」,作者鴨血粉絲Tang 。轉(zhuǎn)載本文請聯(lián)系Java極客技術(shù)公眾號。

一、提問環(huán)節(jié)

在剛進(jìn)入 IT 行業(yè)的第一年換工作的時候,至今讓我印象最深刻的有一個這樣的面試題:如何通過 SQL 方式將數(shù)據(jù)庫的行轉(zhuǎn)列?

當(dāng)時的面試官讓我現(xiàn)場寫 SQL,信心滿滿的我,我覺得我可以做出來,然后10分支、20分鐘、30分鐘...過去了,很遺憾一點(diǎn)動靜都沒有。

最后的我不得不服,結(jié)局相信大家也能猜到是啥了!??

二、場景分析

面試結(jié)束之后,不服輸?shù)奈覜Q定要把這個問題給破解掉,回到自己的租處之后,打開電腦,決定從0開始琢磨,怎么實(shí)現(xiàn)行轉(zhuǎn)列呢?

其實(shí)如果你是一個經(jīng)常玩 sql 的人,相信看到這個提問的時候,你心里已經(jīng)有答案了,解決這個問題,方法其實(shí)很簡單,通過下面這個語法即可實(shí)現(xiàn)。

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

例如下面是一張很常見的學(xué)生考試成績表,我們將學(xué)生的考試成績以單表的形式存儲到數(shù)據(jù)庫表中。

我們想要以下圖形式,并以總分排名從高到底進(jìn)行展示,如何通過 SQL 方式實(shí)現(xiàn)呢?

有的同學(xué)說,我可以通代碼層面來實(shí)現(xiàn),不可否認(rèn),代碼完全可以實(shí)現(xiàn),只需要封裝一個如下形式的數(shù)據(jù)結(jié)構(gòu)就可以了。

  1. //學(xué)生姓名為key,相同key的數(shù)據(jù)封裝到List集合中 
  2. Map<String, List<StudentExam> studentExamMap = new HashMap(); 

其中學(xué)生姓名就是一個Key,然后把相同學(xué)生姓名的數(shù)據(jù)封裝到List集合中,最后將學(xué)生姓名的總分合計(jì)起來,做一個排序,也可以實(shí)現(xiàn)。

在面對少量數(shù)據(jù)的時候,這種方式?jīng)]問題,只是計(jì)算復(fù)雜了一點(diǎn),但是當(dāng)數(shù)據(jù)庫表超過 5000 以上的時候,這種在代碼層面的計(jì)算,內(nèi)存就有點(diǎn)吃不消了,因此極其不推薦采用。

面對這種場景需求,我們多半會采用通過 sql 方式來解決,那么通過 sql 方式破解呢?請看下圖

其中最關(guān)鍵的一步就是先用case when ... then ... else ... end語法將不同的課程分?jǐn)?shù)分離出來,然后通過sum + group聚合函數(shù)查詢進(jìn)行分?jǐn)?shù)匯總,最后通過order by語法將分?jǐn)?shù)進(jìn)行從高到低排序,進(jìn)而達(dá)到我們想要的預(yù)期效果!

其實(shí)像這樣的行轉(zhuǎn)列的查詢邏輯非常的普遍,例如剛過去的奧運(yùn)獎牌排行榜!

還有全球新冠疫情數(shù)據(jù)排名。

可能不同的應(yīng)用實(shí)現(xiàn)方式不一樣,但是大體的解決思路是一樣的,將數(shù)據(jù)進(jìn)行分組聚合匯總,然后按照分?jǐn)?shù)進(jìn)行從高到低排名。

通過 SQL 實(shí)現(xiàn)還有一個非常大的好處,就是可以根據(jù)不同的維度進(jìn)行排序,同時支持多個字段進(jìn)行排序,如果在代碼層面去實(shí)現(xiàn)排序,相當(dāng)復(fù)雜。

三、小結(jié)

本文主要圍繞如何通過 sql 的方式,將數(shù)據(jù)庫表中的行轉(zhuǎn)列進(jìn)行顯示,希望能幫助到大家!

 

責(zé)任編輯:武曉燕 來源: Java極客技術(shù)
相關(guān)推薦

2021-12-08 06:53:29

面試動態(tài)代理

2022-09-29 07:30:57

數(shù)據(jù)庫索引字段

2020-08-06 07:49:57

List元素集合

2021-07-06 07:08:18

管控數(shù)據(jù)數(shù)倉

2021-12-16 22:59:21

SQL報表應(yīng)用

2020-08-17 07:40:19

消息隊(duì)列

2024-09-19 08:10:54

2015-08-13 10:29:12

面試面試官

2020-11-11 10:05:04

數(shù)據(jù)庫分庫分表美團(tuán)面試

2010-07-13 16:20:30

SQL Server數(shù)

2020-09-24 06:39:58

MySQL數(shù)據(jù)庫

2023-02-16 08:10:40

死鎖線程

2022-03-30 07:28:24

MySQL數(shù)據(jù)庫ACID

2024-10-16 21:17:59

2010-08-12 16:28:35

面試官

2024-04-03 00:00:00

Redis集群代碼

2024-09-11 22:51:19

線程通訊Object

2025-03-17 00:00:00

2023-11-20 10:09:59

2024-02-26 14:07:18

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲国产欧美精品 | 91精品国产自产精品男人的天堂 | 久久久噜噜噜久久中文字幕色伊伊 | 国产精品久久性 | 久久久www成人免费无遮挡大片 | 精品久久久网站 | 精品网站999www | 亚洲成人精品 | 中文在线播放 | 可以看黄的视频 | 一本在线| 亚洲综合99 | 毛片毛片毛片毛片毛片 | 中文字幕亚洲区一区二 | 精品久久久久久久 | 成人福利在线视频 | 亚洲精品久久久一区二区三区 | 国产小视频在线看 | 天堂一区二区三区 | 色婷婷综合久久久中字幕精品久久 | 国产免费一区 | 超碰在线国产 | 国产精品视频久久久 | 精品国产乱码久久久久久a丨 | 国产福利在线 | 国产在线一区二区 | 亚洲视频一区在线观看 | 免费国产一区 | 亚洲啪啪一区 | 一区二区在线免费观看 | 亚洲日韩中文字幕一区 | 国产精品久久久久久久久久免费看 | 国产精品美女一区二区三区 | 成人在线免费视频 | 亚洲一区二区三区四区五区中文 | 我要看黄色录像一级片 | 日本成人中文字幕 | 自拍偷拍视频网 | 一级做受毛片免费大片 | 亚洲精品在线播放 | 欧美性生交大片免费 |