PL/SQL 實現行列轉換


  這篇博文寫的是簡單的行列轉換的,以一個具體的例子來給出。

  以前在論壇上有人問過相關的問題,上面的回答五光十色,有很多是可行的,當然更多的是自以為很高端,實際卻不着邊際的回答。下面進入正題。

part1:列轉行。需求:

示例給出這么一張表:

表定義如下:

create table TEST_TB_GRADE 
( 
  ID        NUMBER(10) not null, 
  USER_NAME VARCHAR2(20 CHAR), 
  COURSE    VARCHAR2(20 CHAR), 
  SCORE     FLOAT 
) 

要求轉換成為:

下面給出一個可行的PL/SQL語句:

select t.user_name as 姓名, 
  sum(decode(t.course, '語文', score,null)) as 語文, 
  sum(decode(t.course, '數學', score,null)) as 數學, 
  sum(decode(t.course, '英語', score,null)) as 英語 
from test_tb_grade t 
group by t.user_name 
order by t.user_name

 

實現效果如下圖需求所示。

Part2:行轉列。需求:

示例給出這樣一張表

表結構如下:

create table TEST_TB_GRADE2 
( 
  ID         NUMBER(10) not null, 
  USER_NAME  VARCHAR2(20 CHAR), 
  CN_SCORE   FLOAT, 
  MATH_SCORE FLOAT, 
  EN_SCORE   FLOAT 
) 

需要轉換成如下形式:

下面給出一個可執行的PL/SQL語句:

select user_name, '語文' as COURSE , CN_SCORE as SCORE from test_tb_grade2  
union all
select user_name, '數學' as COURSE, MATH_SCORE as SCORE from test_tb_grade2  
union all
select user_name, '英語' as COURSE, EN_SCORE as SCORE from test_tb_grade2  
order by user_name,COURSE

 

實現效果如下圖需求所示。

 

本文旨以一個具體的例子,給出一種Oracle中行列轉換的方案,沒有什么可圈可點的地方,歡迎給出其他實現,也歡迎批評指正!

【請點擊下面的“綠色通道”-----“關注DebugLZQ” ,共同交流進步~】


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM