日期:2014-05-17  浏览次数:21269 次

oracle 的列转行问题。
表

姓名 语文 数学 外语
张一 10 20 30

杨二 20 30 40

王三 40 50 60

........................(n多条)

变成


姓名 科目 分数
张一 语文 10
张一 数学 20
张一 外语 30

......


oracle有什么好的方法来转变一下吗,将列转成行。

------解决方案--------------------
SQL code
select * from(
select 姓名,'语文' 科目,语文 分数 from 表
union all
select 姓名,'数学' 科目,数学 分数 from 表
union all
select 姓名,'外语' 科目,外语 分数 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;