在oracle中,可以利用pivot()函數將橫錶轉為縱表,該函數用於將行轉為列,語法為「SELECT * FROM (資料查詢集)PIVOT(SUM(行轉列後列的值)FOR 需要行轉列的列IN (轉換後列的值))」。
本教學操作環境:Windows10系統、Oracle 11g版、Dell G3電腦。
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橫錶怎麼轉縱表的詳細內容。更多資訊請關注PHP中文網其他相關文章!