首頁  >  文章  >  資料庫  >  oracle怎麼實現行列轉換

oracle怎麼實現行列轉換

青灯夜游
青灯夜游原創
2022-01-25 17:23:1148181瀏覽

實現行列轉換的方法:1、利用PIVOT()函數實作行轉列,語法「SELECT * FROM (資料集) PIVOT (SUM(Score) FOR coursename IN (轉換後列的值)) 」;2、利用unpivot()函數實現列轉行。

oracle怎麼實現行列轉換

本教學操作環境:Windows7系統、Oracle 11g版、Dell G3電腦。

Oracle行轉列

    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對對應的課程的成績值進行轉換,然後再求和即可得到該門成績的結果值,結果如下:

oracle怎麼實現行列轉換

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列轉行就是把一行當中的列的欄位依照行的唯一值轉換成多行資料。例如上文Oracle行轉列   中的學生成績表的基礎資料是一個學生的一個科目成績對應著是一筆記錄。然後我們進行了行轉列後變成一個學生對應著每列(數學、英語、語文)科目的成績是一筆記錄。那麼本文就是要把之前轉換後的學生成績表(備份表score_copy)再次進行列轉行,轉換為原始資料。案例資料如下:

oracle怎麼實現行列轉換

oracle怎麼實現行列轉換

那我們要如何實作列轉行呢?以下介紹兩種常用的方法:

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

結果如下:

oracle怎麼實現行列轉換

2、利用Oracle自帶的列轉行函數unpivot也可以完美解決此問題,具體語法結構如下:

select 字段 from 数据集
unpivot(自定义列名/*列的值*/ for 自定义列名 in(列名))

    實作程式碼如下:

select stuname, coursename ,score from
score_copy  t
unpivot
(score for coursename in (英语,数学,语文))

    結果如下:

oracle怎麼實現行列轉換

推薦教學:《Oracle教學

以上是oracle怎麼實現行列轉換的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn