表A 
姓名 科目 成绩
张三 语文 90
张三 数学 91
张三 生物 92
李四 语文 80
李四 物理 30
王五 生物 45
王五 物理 87通过SQL 得到姓名 科目1 成绩1 科目2 成绩2 科目3 成绩3
张三 语文 90 数学 91 生物 92
李四 语文 80 物理 30
王五 生物 45 物理 87

解决方案 »

  1.   

    select 姓名,max(decode(rn,1,科目)) 科目1,max(decode(rn,1,成绩)) 成绩1,
    max(decode(rn,2,科目)) 科目2,max(decode(rn,2,成绩)) 成绩2,
    max(decode(rn,3,科目)) 科目3,max(decode(rn,3,成绩)) 成绩3 
    from (select 姓名,科目,成绩,row_number() over(partition by 姓名 order by rownum) rn from tb)
    group by 姓名;
      

  2.   

    12:38:09 scott@TUNGKONG> with tb as (select '张三' 姓名,'语文' 科目,90 成绩 from dual
    12:38:10   2  union all
    12:38:10   3  select '张三','数学',91 from dual
    12:38:10   4  union all
    12:38:10   5  select '张三','生物',92 from dual
    12:38:10   6  union all
    12:38:10   7  select '李四','语文',80 from dual
    12:38:10   8  union all
    12:38:10   9  select '李四','物理',30 from dual
    12:38:10  10  union all
    12:38:10  11  select '王五','生物',45 from dual
    12:38:10  12  union all
    12:38:10  13  select '王五','物理',87 from dual)
    12:38:10  14  select 姓名,max(decode(rn,1,科目)) 科目1,max(decode(rn,1,成绩)) 成绩1,
    12:38:10  15  max(decode(rn,2,科目)) 科目2,max(decode(rn,2,成绩)) 成绩2,
    12:38:10  16  max(decode(rn,3,科目)) 科目3,max(decode(rn,3,成绩)) 成绩3
    12:38:10  17  from (select 姓名,科目,成绩,row_number() over(partition by 姓名 order by rownum) rn from tb)
    12:38:10  18  group by 姓名;姓名 科目      成绩1 科目      成绩2 科目      成绩3
    ---- ---- ---------- ---- ---------- ---- ----------
    李四 语文         80 物理         30
    王五 生物         45 物理         87
    张三 语文         90 数学         91 生物         92已用时间:  00: 00: 00.00
      

  3.   

    那你的科目数应该有个上限吧
    就是一个人最多有多少科目,假设是n,那么改动一下就行啊select 姓名,max(decode(rn,1,科目)) 科目1,max(decode(rn,1,成绩)) 成绩1,
    max(decode(rn,2,科目)) 科目2,max(decode(rn,2,成绩)) 成绩2,
    ...........
    ...........
    max(decode(rn,n,科目)) 科目n,max(decode(rn,n,成绩)) 成绩n 
    from (select 姓名,科目,成绩,row_number() over(partition by 姓名 order by rownum) rn from tb)
    group by 姓名;
      

  4.   

    如果这个科目的上限也不固定,那就用过程动态的拼出SQL语句或产生一个视图,然后你去查询动态生成的这个视图。