Oracle種幾種常用的行轉列方法

一、首先讓我們來看看這個神奇的函數wm_concat(列名),該函數可以把列值以","號分隔起來,並顯示成一行,接下來上例子,看看這個神奇的函數如何應用
select table_name,WMSYS.WM_CONCAT(column_name) B
from user_tab_columns
得到結果效果:
table_name B
tmp 1,2,3,4,5

把結果裏的逗號替換成"|"
select table_name,WMSYS.WM_CONCAT(column_name , ',' , '|') B
from user_tab_columns
得到結果:
table_name B
tmp 1|2|3|4|5

二、使用listagg函數
select table_name,listagg(column_name,',') within group (order by column_name) B
from user_tab_columns
group by table_name;

三、使用decode函數
建表
create table STUDENT_SCORE(name VARCHAR2(20),subject VARCHAR2(20),score NUMBER(4,1))

– 添加數據
insert into student_score (NAME, SUBJECT, SCORE) values ('張三', '語文', 78.0);
insert into student_score (NAME, SUBJECT, SCORE) values ('張三', '數學', 88.0);
insert into student_score (NAME, SUBJECT, SCORE) values ('張三', '英語', 98.0);
insert into student_score (NAME, SUBJECT, SCORE) values ('李四', '語文', 89.0);
insert into student_score (NAME, SUBJECT, SCORE) values ('李四', '數學', 76.0);
insert into student_score (NAME, SUBJECT, SCORE) values ('李四', '英語', 90.0);
insert into student_score (NAME, SUBJECT, SCORE) values ('王五', '語文', 99.0);
insert into student_score (NAME, SUBJECT, SCORE) values ('王五', '數學', 66.0);
insert into student_score (NAME, SUBJECT, SCORE) values ('王五', '英語', 91.0);

– 希望得到下面的結果 
– 姓名 語文 數學 英語 
– 王五 89 56 89
select ss.name,
max(decode(ss.subject, '語文', ss.score)) 語文,
max(decode(ss.subject, '數學', ss.score)) 數學,
max(decode(ss.subject, '英語', ss.score)) 英語
from student_score ssgroup by ss.name;

四、使用case when then end
select ss.name,
max(case  when ss.subject = '語文' then  ss.scoreend) 語文,
max(case  when ss.subject = '數學' then  ss.scoreend) 數學,
max(case  when ss.subject = '英語' then  ss.scoreend) 英語
from student_score ssgroup by ss.name;

總結:其實熟練使用一兩種行轉列方法就行了,方法不在於多,而在於精。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章