表姓名  语文  数学  外语
张一   10    20     30杨二   20    30     40王三   40     50    60........................(n多条)变成
姓名  科目  分数
张一   语文   10
张一   数学   20
张一   外语   30......
oracle有什么好的方法来转变一下吗,将列转成行。

解决方案 »

  1.   

    select * from(
    select 姓名,'语文' 科目,语文 分数 from 表
    union all
    select 姓名,'数学' 科目,数学 分数 from 表
    union all
    select 姓名,'外语' 科目,外语 分数 from 表)
    order by 姓名
      

  2.   


    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;