表a中
学生id 学生姓名 科目   成绩
1      甲       语文  90
2      乙       数学  80
3      甲       数学  79
4      乙       语文  70科目固定
学生姓名不固定如何查询出以下形式,包含合计
学生姓名    语文      数学
甲          90       79
乙          70       80
合计       160      159
sql如何写?谢谢!

解决方案 »

  1.   

    create or replace package sp_test
    is
    type ResultData is ref cursor;
    procedure getRstData( rst out ResultData,str out varchar);
    end sp_test;
    create or replace package body sp_test
    is
      procedure getRstData( rst out ResultData,str out varchar)
      is
        cursor cur is select distinct 科目 from a;
      begin
        str:='select a.学生姓名';    for t_cur in cur loop
          str := str||',sum(decode(b.科目,'''||t_cur.科目||''',成绩,0)) "'||t_cur.科目||'"';
        end loop;
        str:=str||' from a group by a.学生姓名';    open rst for str;
      end getRstData;
    end sp_test;
      

  2.   

    select * from
    (select 学生姓名,
    sum(case 科目 when '语文' then 成绩 end) 语文, 
    sum(case 科目 when '数学' then 成绩 end) 数学,
    from a group by 学生姓名
    union
    select '',
    sum(case 科目 when '语文' then 成绩 end) 语文, 
    sum(case 科目 when '数学' then 成绩 end) 数学,
    from a)
    order by 学生姓名;
      

  3.   

    -- 创建存储学生各科成绩表
    create table t_result (id varchar2(2),username varchar2(10),subject varchar2(10),score number(5));-- 初始化表数据
    insert into t_result (id,username,subject,score)values('1','甲','语文','90');
    insert into t_result (id,username,subject,score)values('2','乙','数学','80');
    insert into t_result (id,username,subject,score)values('3','甲','数学','79');
    insert into t_result (id,username,subject,score)values('4','乙','语文','70');
    commit;-- 统计各学科总分SELECT nvl(t.username,'合计') 学生姓名,
           sum(decode(t.subject,'语文',t.score,0)) 语文,
           sum(decode(t.subject,'数学',t.score,0)) 数学
      FROM t_result t
      GROUP BY ROLLUP(t.username);-- 查询结果如下:
    SQL> SELECT nvl(t.username,'合计') 学生姓名,
      2         sum(decode(t.subject,'语文',t.score,0)) 语文,
      3         sum(decode(t.subject,'数学',t.score,0)) 数学
      4    FROM t_result t
      5    GROUP BY ROLLUP(t.username);学生姓名         语文       数学
    ---------- ---------- ----------
    甲                 90         79
    乙                 70         80
    合计              160        159
      

  4.   

    mmvtc 回答的很好,使用rollup就可以将问题全部解决掉,up,使用存储过程比较麻烦