表
姓名 语文 数学 外语
张一 10 20 30
杨二 20 30 40
王三 40 50 60
........................(n多条)
变成
姓名 科目 分数
张一 语文 10
张一 数学 20
张一 外语 30
......
oracle有什么好的方法来转变一下吗,将列转成行。
------解决方案--------------------
- SQL code
select * from(select 姓名,'语文' 科目,语文 分数 from 表union allselect 姓名,'数学' 科目,数学 分数 from 表union allselect 姓名,'外语' 科目,外语 分数 from 表)order by 姓名
------解决方案--------------------
- SQL code
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;