表姓名 语文 数学 外语
张一 10 20 30杨二 20 30 40王三 40 50 60........................(n多条)变成
姓名 科目 分数
张一 语文 10
张一 数学 20
张一 外语 30......
oracle有什么好的方法来转变一下吗,将列转成行。
张一 10 20 30杨二 20 30 40王三 40 50 60........................(n多条)变成
姓名 科目 分数
张一 语文 10
张一 数学 20
张一 外语 30......
oracle有什么好的方法来转变一下吗,将列转成行。
select 姓名,'语文' 科目,语文 分数 from 表
union all
select 姓名,'数学' 科目,数学 分数 from 表
union all
select 姓名,'外语' 科目,外语 分数 from 表)
order by 姓名
create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int);
--
insert into tb values('张三' , '语文' , 74);
insert into tb values('张三' , '数学' , 83);
insert into tb values('张三' , '物理' , 93);
insert into tb values('李四' , '语文' , 74);
insert into tb values('李四' , '数学' , 84);
insert into tb values('李四' , '物理' , 94);
--动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)declare
v_sql varchar2(4000);
begin
v_sql:= 'select 姓名 ,';
select v_sql || wmsys.wm_concat(' max(case 课程 when ''' || 课程 || ''' then 分数 else 0 end) ' || 课程 || '') into v_sql
from (select distinct 课程 from tb) a;
v_sql := v_sql || ' from tb group by 姓名';
dbms_output.put_line(v_sql);
--execute immediate v_sql;--把dbms_output.put_line(v_sql) 语句运行出来的脚本 跑一边就可以了
end;