日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
面試官提問:如何通過SQL方式將數(shù)據(jù)庫表行轉(zhuǎn)列?

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

創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的溧水網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

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

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

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

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

二、場景分析

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

三、小結(jié)

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


當(dāng)前名稱:面試官提問:如何通過SQL方式將數(shù)據(jù)庫表行轉(zhuǎn)列?
網(wǎng)頁路徑:http://www.5511xx.com/article/cdgjgeg.html