實現行列轉換的方法:1、利用PIVOT()函數實現行轉列,語法「SELECT * FROM (資料集) PIVOT (SUM(Score) FOR coursename IN (轉換後列的值))」;2、利用unpivot()函數實現列轉行。
本教學操作環境:Windows7系統、Oracle 11g版、Dell G3電腦。
Oracle行轉列
Oracle行轉列就是把某一個欄位的值作為唯一值,然後另外一個欄位的行值轉換成它的列值。這裡依然利用我們系統的學生成績表作為例子,成績表記錄(行)當中對應著每一個科目的每一個學生的成績,那我們要做出一個報表是每個學生的所有科目作為一列展示出學生的成績資訊。案例資料如下:
那我們要如何實現呢?下面就一一介紹幾種方法:
1、首先我們肯定想到的是利用Oracle分組(group by)應該可以實現,實現程式碼如下:
select c.stuname, --利用分組聚合函數 sum(decode(b.coursename, '英語(2018上學期)', t.score, 0)) as "英語(2018上學期)", sum(decode(b.coursename, '數學(2018上學期)', t.score, 0)) as "英語(2018上學期)", sum(decode(b.coursename, '語文(2018上學期)', t.score, 0)) as "英語(2018上學期)" from STUDENT.SCORE t, student.course b, student.stuinfo c where t.courseid = b.courseid and t.stuid = c.stuid group by c.stuname
我們利用group by對學生進行分組,然後利用decode對對應的課程的成績值進行轉換,然後再求和即可得到該門成績的結果值,結果如下:
2、Oracle11g之後提供了自帶函數PIVOT可以完美解決這個行轉列的需求,具體語法結構如下:
SELECT * FROM (資料查詢集)PIVOT ( SUM(Score/*行轉列後 列的值*/) FOR coursename/*需要行轉列的列*/ IN (轉換後列的值) )
具體程式碼如下:
select * from (select c.stuname, b.coursename, t.score from STUDENT.SCORE t, student.course b, student.stuinfo c where t.courseid = b.courseid and t.stuid = c.stuid ) /*資料來源*/PIVOT ( SUM(score/*行轉列後 列的值*/) FOR coursename/*需要行轉列的列*/ IN ('英語(2018上學期)' as 英語,'數學(2018上學期)' as 數學,'語文(2018上學期)' as 語文 ) ) ;
結果如下:
Oracle列轉行
Oracle列轉行就是把一行當中的列的欄位按照行的唯一值轉換成多行資料。 比如上文Oracle行轉列 中的學生成績表的基礎資料是一個學生的一個科目成績對應著是一條記錄。然後我們進行了行轉列後變成一個學生對應著每列(數學、英語、語文)科目的成績是一條記錄。那麼本文就是要把之前轉換後的學生成績表(備份表score_copy)再次進行列轉行,轉換為原始資料。案例資料如下:
那我們要如何實現列轉行呢?下面介紹兩種常用的方法:
1、利用union all 進行拼接,可以完美的把對應的列轉為行記錄,具體程式碼如下:
select t.stuname, '英語' as coursename ,t.英語 as score from SCORE_COPY t union all select t.stuname, '數學' as coursename ,t.數學 as score from SCORE_COPY t union all select t.stuname, '語文' as coursename ,t.語文 as score from SCORE_COPY t
結果如下:
2、利用Oracle自帶的列轉行函數unpivot也可以完美解決該問題,具體語法結構如下:
select 欄位 from 資料集 unpivot(自定義列名/*列的值*/ for 自定義列名 in(列名))
實現程式碼如下:
select stuname, coursename ,score from score_copy t unpivot (score for coursename in (英語,數學,語文))
結果如下:
以上就是oracle怎麼實現行列轉換的詳細內容,更多請關注TW511.COM其它相關文章!