oracle 行列轉換 總結

2021-06-18 03:08:09 字數 3257 閱讀 1184

oracle行列轉換小結

目錄結構如下:

行轉列列轉行

[一]、行轉列

1.1、初始測試資料

表結構:test_tb_grade

sql** 

create table test_tb_grade 

( id        number(10) not null, 

user_name varchar2(20 char), 

course    varchar2(20 char), 

score     float 

) 初始資料如下圖:

1.2、 如果需要實現如下的查詢效果圖:

這就是最常見的行轉列,主要原理是利用decode函式、聚集函式(sum),結合group by分組實現的,具體的sql如下:

sql** 

select t.user_name, 

sum(decode(t.course, '語文', score,null)) as chinese, 

sum(decode(t.course, '數學', score,null)) as math, 

sum(decode(t.course, '英語', score,null)) as english 

from test_tb_grade t 

group by t.user_name 

order by t.user_name 

1.3、延伸

如果要實現對各門功課的不同分數段進行統計,效果圖如下:

具體的實現sql如下:

sql** 

select t2.score_gp, 

sum(decode(t2.course, '語文', countnum,null)) as chinese, 

sum(decode(t2.course, '數學', countnum,null)) as math, 

sum(decode(t2.course, '英語', countnum,null)) as english 

from ( 

select t.course, 

case when t.score  <60 then '00-60' 

when t.score >=60 and t.score <80  then '60-80' 

when t.score >=80 then '80-100' end as score_gp, 

count(t.score) as countnum 

from test_tb_grade t 

group by t.course,  

case when t.score  <60  then '00-60' 

when t.score >=60 and t.score <80  then '60-80' 

when t.score >=80 then '80-100' end 

order by t.course ) t2 

group by t2.score_gp 

order by t2.score_gp 

[二]、列轉行

1.1、初始測試資料

表結構:test_tb_grade2

sql** 

create table test_tb_grade2 

( id         number(10) not null, 

user_name  varchar2(20 char), 

cn_score   float, 

math_score float, 

en_score   float 

) 初始資料如下圖:

1.2、 如果需要實現如下的查詢效果圖:

這就是最常見的列轉行,主要原理是利用sql裡面的union,具體的sql語句如下:

sql** 

select user_name, '語文' course , cn_score as score from test_tb_grade2  

union select user_name, '數學' course, math_score as score from test_tb_grade2  

union select user_name, '英語' course, en_score as score from test_tb_grade2  

order by user_name,course  

也可以利用【 insert all into ... select 】來實現,首先需要先建乙個表test_tb_grade3:

sql** 

create table test_tb_grade3   

(  user_name varchar2(20 char),   

course    varchar2(20 char),   

score     float   

)   

再執行下面的sql:

sql** 

insert all 

into test_tb_grade3(user_name,course,score) values(user_name, '語文', cn_score) 

into test_tb_grade3(user_name,course,score) values(user_name, '數學', math_score) 

into test_tb_grade3(user_name,course,score) values(user_name, '英語', en_score) 

select user_name, cn_score, math_score, en_score from test_tb_grade2; 

commit; 

別忘記commit操作,然後再查詢test_tb_grade3,發現表中的資料就是列轉成行了。

Oracle行列轉換

1.列轉行 create table t col row id int,c1 varchar2 10 c2 varchar2 10 c3 varchar2 10 insert into t col row values 1,v11 v21 v31 insert into t col row valu...

Oracle行列轉換

行轉列 select count over cnt,rn,str from select rownum rn,substr a.str,instr a.str,1,a.n 1,instr a.str,1,a.n 1 instr a.str,1,a.n 1 str from select a,b,c,...

oracle 行列轉換

q 如何實現行列轉換 a 1 固定列數的行列轉換 如student subject grade student1 語文 80 student1 數學 70 student1 英語 60 student2 語文 90 student2 數學 80 student2 英語 100 轉換為 語文 數學 英...