SQL行轉(zhuǎn)列、列轉(zhuǎn)行的簡單實現(xiàn)
前言
行列轉(zhuǎn)換在做報表分析時還是經(jīng)常會遇到的,今天就說一下如何實現(xiàn)行列轉(zhuǎn)換吧。
行列轉(zhuǎn)換就是如下圖所示兩種展示形式的互相轉(zhuǎn)換

行轉(zhuǎn)列
假如我們有下表:

SELECT * FROM student PIVOT ( SUM(score) FOR subject IN (語文, 數(shù)學(xué), 英語) )
通過上面 SQL 語句即可得到下面的結(jié)果

PIVOT 后跟一個聚合函數(shù)來拿到結(jié)果,F(xiàn)OR 后面跟的科目是我們要轉(zhuǎn)換的列,這樣的話科目中的語文、數(shù)學(xué)、英語就就被轉(zhuǎn)換為列。IN 后面跟的就是具體的科目值。
當(dāng)然我們也可以用 CASE WHEN 得到同樣的結(jié)果,就是寫起來麻煩一點。
SELECT name, MAX( CASE WHEN subject='語文' THEN score ELSE 0 END) AS "語文", MAX( CASE WHEN subject='數(shù)學(xué)' THEN score ELSE 0 END) AS "數(shù)學(xué)", MAX( CASE WHEN subject='英語' THEN score ELSE 0 END) AS "英語" FROM student GROUP BY name
使用 CASE WHEN 可以得到和 PIVOT 同樣的結(jié)果,沒有 PIVOT 簡單直觀。
列轉(zhuǎn)行
假設(shè)我們有下表 student1

SELECT *
FROM student1
UNPIVOT (
score FOR subject IN ("語文","數(shù)學(xué)","英語")
)
通過 UNPIVOT 即可得到如下結(jié)果:

我們也可以使用下面方法得到同樣結(jié)果
SELECT
NAME,
'語文' AS subject ,
MAX("語文") AS score
FROM student1 GROUP BY NAME
UNION
SELECT
NAME,
'數(shù)學(xué)' AS subject ,
MAX("數(shù)學(xué)") AS score
FROM student1 GROUP BY NAME
UNION
SELECT
NAME,
'英語' AS subject ,
MAX("英語") AS score
FROM student1 GROUP BY NAME
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。
相關(guān)文章
14種SQL的進(jìn)階用法分享(更高效地處理數(shù)據(jù))
在實際的數(shù)據(jù)庫使用中除了CRUD還有很多高級應(yīng)用值得學(xué)習(xí)和掌握,能夠在平時的工作中得到很多便利,這篇文章主要給大家分享介紹了14種SQL的進(jìn)階用法,通過文中介紹的方法可以更高效地處理數(shù)據(jù)庫數(shù)據(jù),需要的朋友可以參考下2024-01-01
介紹PostgreSQL中的jsonb數(shù)據(jù)類型
這篇文章主要介紹了介紹PostgreSQL中的jsonb數(shù)據(jù)類型,jsonb是PostgreSQL9.4中開始內(nèi)置的類型,能夠支持GIN索引,需要的朋友可以參考下2015-04-04
sql中l(wèi)eft join的效率分析與提高效率方法
網(wǎng)站隨著數(shù)據(jù)量與訪問量越來越大,訪問的速度變的越來越慢,于是開始想辦法解決優(yōu)化速度慢的原因,下面是對程序中一條sql的分析與提高效率的過程2018-03-03
數(shù)據(jù)庫分頁查詢語句數(shù)據(jù)庫查詢
關(guān)于分頁 SQL 的資料許多,有的使用存儲過程,有的使用游標(biāo)。本人不喜歡使用游標(biāo),我覺得它耗資、效率低;使用存儲過程是個不錯的選擇,因為存儲過程是顛末預(yù)編譯的,執(zhí)行效率高,也更靈活2014-08-08
數(shù)據(jù)庫中的左連接(left join)和右連接(right join)區(qū)別
關(guān)于左連接和右連接總結(jié)性的一句話,左連接 where只影向右表,右連接where只影響左表2012-06-06

