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;

总结:其实熟练使用一两种行转列方法就行了,方法不在于多,而在于精。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值