一、首先让我们来看看这个神奇的函数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;
总结:其实熟练使用一两种行转列方法就行了,方法不在于多,而在于精。