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

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;