Oracle行列轉換小結

2021-06-22 21:04:24 字數 3119 閱讀 9041

目錄結構如下:

[一]、行轉列

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'

endas 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'

endorder

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

allinto 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行列轉換小結

oracle行列轉換小結 目錄結構如下 行轉列列轉行 一 行轉列 1.1 初始測試資料 表結構 test tb grade sql create table test tb grade id number 10 not null,user name varchar2 20 char course v...

Oracle行列轉換小結

oracle行列轉換小結 目錄結構如下 行轉列列轉行 一 行轉列 1.1 初始測試資料 表結構 test tb grade sql create table test tb grade id number 10 not null,user name varchar2 20 char course v...

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 ch...