create table tb(姓名 varchar2(10) , 课程 varchar2(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);问题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
想变成(得到如下结果): 
姓名 语文 数学 物理 (说明:课程不一定只这三门不能写死的)
---- ---- ---- ----
李四 74   84   94
张三 74   83   93
-------------------

解决方案 »

  1.   

    oracel 精华帖里就有 http://topic.csdn.net/u/20100109/13/6a10c168-f190-4766-b838-adbf03c4ac7b.html?35699
      

  2.   

    col 分数 for a55;
    select tb.姓名, replace(wm_concat(to_char(tb.分数)),',',' ') as 分数
    from tb
    group by tb.姓名;select tb.姓名, replace(wm_concat(tb.课程||':'||to_char(tb.分数)),',',' ') as 分数
    from tb
    group by tb.姓名;
      

  3.   


    create table tb(姓名 varchar2(10) , 课程 varchar2(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> select tb.姓名, replace(wm_concat(to_char(tb.分数)),',',' ') as 分数
      2  from tb
      3  group by tb.姓名;
    /*
    姓名       分数
    ---------- -------------------------------------------------------
    李四       74 84 94
    张三       74 83 93
    */
    SQL> select tb.姓名, replace(wm_concat(tb.课程||':'||to_char(tb.分数)),',',' ') as 分数
      2  from tb
      3  group by tb.姓名;
    /*
    姓名       分数
    ---------- -------------------------------------------------------
    李四       语文:74 数学:84 物理:94
    张三       语文:74 数学:83 物理:93
    */
    --下面是你想要得到的结果:
    select tb.姓名,
           max(decode(tb.课程,'语文',tb.分数)) 语文,
           max(decode(tb.课程,'数学',tb.分数)) 数学,
           max(decode(tb.课程,'物理',tb.分数)) 物理
    from tb
    group by tb.姓名;
    /*
    姓名             语文       数学       物理
    ---------- ---------- ---------- ----------
    李四               74         84         94
    张三               74         83         93
    */
    --学校就那么几门课程,增加课程就增加下面的语句:
    max(decode(tb.课程,'化学',tb.分数)) 化学
      

  4.   


    Oracle DECODE函数的语法介绍
      

  5.   

    楼主,看看小弟的方法行不。不过课程不是活的,当有新的课程的时候,楼主需要改SQL语句,继续加列,如下:
     select 姓名,sum(语文) 语文,sum(数学) 数学,sum(物理) 物理 from 
     (
       select 姓名,sum(decode(课程,'语文',分数)) as 语文,sum(decode(课程,'数学',分数)) as 数    学,sum(decode(课程,'物理',分数)) as 物理
       from tb group by  姓名,课程
    ) group by 姓名
      

  6.   

    create table tb(sname varchar2(10) , sclass varchar2(10) , score 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);
    select sname 姓名,
           sum(decode(SCLASS, '语文', SCORE)) 语文,
           sum(decode(SCLASS, '物理', SCORE)) 物理,
           sum(decode(SCLASS, '数学', SCORE)) 数学
      from tb
     group by sname
      

  7.   

    create table tb(sname varchar2(10) , sclass varchar2(10) , score 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);1.列转行
     create table bt as select sname 姓名,
           sum(decode(SCLASS, '语文', SCORE)) 语文,
           sum(decode(SCLASS, '物理', SCORE)) 物理,
           sum(decode(SCLASS, '数学', SCORE)) 数学
      from tb
     group by sname2.根据列转行结果再行转列
    select a.姓名 sname, decode(b.lv, 1, '语文', 2, '物理', 3, '数学') sclass,
           decode(b.lv, 1, a.语文, 2, a.物理, 3, a.数学) score
      from bt a, (select level lv from dual connect by level <4) b