表如下:
table class
id    name   学科    成绩
01    张三    语文    110
02    张三    数学    98
03    张三    英语    120
04    张三    物理    85
05    张三    化学    75
06    张三    生物    55
07    张三    政治    89
.      .      .     .
.      .      .     .
.      .      .     .
nn    张三     xx    yy
nn1   李四    语文    120
nn2   李四    数学    112
nn3   李四    英语    98
nn4   李四    物理    82
.      .      .      .
.      .      .      .
.      .      .      .
nnn   李四     xx     yy
要得到如下结果!
name   语文   数学   英语   物理   化学   生物   政治  ......xx
张三    110   98    120    85    75    55    89   ......yy
李四    120   112   98     82   ........................yy
如果只有几列,可以用自连接,但科目有很多,且不确定!

解决方案 »

  1.   

    1:先查询 class 表中有多少个学科,得到一个List;
    2:SELECT DISTINCT c.ID,
                    (SELECT   /*+INDEX(FED ENDDT_P)*/
                              MAX (DECODE (a.学科, '语文', a.成绩, '0'))
                         FROM CLASS a
                     GROUP BY a.学科) AS 语文
    把1中的LIST循环,取得结果来替换里面的语文.
               FROM CLASS c
      

  2.   

    你是说一条一条查询吗?
    有没办法一条sql完成呢?
      

  3.   

    如果一条sql不能完成,效率更高的多条sql也行!
    请大家多多提出,自己的看法!
      

  4.   

    这是竖变横的总题,应该在数据库那块找答案,给你一个思路,用left join能解决,具体到那边去查
      

  5.   

    我的意思是用两个SQL.
    1:先查询 class 表中有多少个学科,得到一个List; 2:StringBuffer  sql =new StringBuffer("SELECT DISTINCT c.ID,  ");
    for(int i=0;list!=null&&i<List.size();i++){
                   sql.append(" (SELECT  MAX (DECODE (a.学科, ').append((String)list.get(i)).append(", a.成绩, '0'))    FROM CLASS a    GROUP BY a.学科) AS ").append((String)list.get(i)).append(", ");

    sql = new StringBuffer(sql.subString(0,sql.length-1));          sql.append("FROM CLASS c");
      

  6.   

    你的答案能完成,但在速度和内存上考虑,就效率不好了!
    你不能让一个客户在那里等很长时间吧!
    答案是这样的!name  语文  数学  英语  物理  化学  生物  政治  ......xx 
    张三    110  98    120    85    75    55    89  ......yy 
    李四    120  112  98    82  ..........................yy 
    .....................................................yy
    .....................................................yy不是一条一条查的!
      

  7.   

    是不是在oracle中有个关键字能完成呢?
      

  8.   

    我希望得到只用sql来完成,得到上面的答案!
    不能加入java c c++ .......等语言
    也不希望用存储过程来完成。
    如有知道的请不要保留!
      

  9.   

    id sid          course  result1 2005001 语文      80.0
    2 2005001 数学      90.0
    3 2005001 英语      80.0
    4 2005002 语文      56.0
    5 2005002 数学      69.0
    6 2005002 英语      89.0declare @sql varchar(8000)
    set @sql='select sid'
    select @sql=@sql+','+course.name+'=isnull(sum(case course when '''+course.name+''' then result end),0)'
     from course order by id 
    set @sql=@sql+' from result group by sid order by sid'
    print @sql
    exec(@sql)得出结果sid           语文 数学 英语 2005001 80.0  90.0  80.0
    2005002 56.0  69.0  89.0
    新闻来自: 新客网(www.xker.com) 详文参考:http://www.xker.com/page/e2007/0205/22415.html
      

  10.   

    oracle 10G+提供这样的一个功能,具体函数忘了, 简单sql 只能用动态sql来写,一条sql 很难办到吧,建议写procedure。反过来,一条sql倒是可以完成。
      

  11.   

    需要3步来完成
    1)查询出所有学科保存到一List
        select distinct 学科 from yourtable2)查询出所有人员成绩
        select name,学科,成绩 from yourtable3)遍历2)输出while(rst.next()){
        if(!rst.getString("name").equals(sName)||rst.last()){
            writeRow(lsHeader,mapRow);
            sName=rst.getString("name");
            mapRow.clear();
        }    mapRow.put(
           sName+"_"+rst.getString("学科"),
           rst.getString("name")
        );
    }上一个项目就是这样实现行专列的
      

  12.   

    我晕,有个地方粘贴错了,应该用成绩来作为map的值
        mapRow.put(
           sName+"_"+rst.getString("学科"),
           rst.getString("成绩")
        );