select distinct name, class, sum(number) from tablename group by name, class

解决方案 »

  1.   

    你如果直接用SQL语句来完成,好象不可能!
    这样吧,你试试下面的方式:一、你新建一个表table2来存储统计的结果,字段分别为:NAME   1级     2级     3级   总计;二、然后编写一个存储过程,来进行统计
    create or replace procedure tongji
    is
      //定义程序中用到的参数变量
      v_name varchar2(20);
      1级    number(2);
      2级    number(2);
      3级    number(2);
      cursor c1 is select NAME(物品种类)from table1;
    begin
       open c1;
       loop
       FETCH c1 INTO v_name;
       exit when c1%notfound;
       select count(*) into 1级 from table1 where CLASS='1' and NAME=v_name;
       select count(*) into 2级 from table1 where CLASS='2' and NAME=v_name;
       select count(*) into 3级 from table1 where CLASS='3' and NAME=v_name;
       insert into table2(统计表) values (v_name,1级,2级,3级,1级+2级+3级);
       commit;
       end loop;
       close c1;
    end;
      

  2.   

    上面的游标有问题:
    cursor c1 is select distinct NAME(物品种类)from table1;
      

  3.   

    select name,sum(decode(CLASS,1,NUMBER,0)) 1级,
                sum(decode(clsss,2,number,0)) 2级,
                sum(decode(clsss,3,number,0)) 3级,
                sum(decode(clsss,4,number,0)) 4级,
                .................................,
                sum(NUMBER)
    from table_name group by name;此语句性能极差,提仪用过程实现.
      

  4.   

    管理->填写密码,分配分数->结贴->填写主要解答人->提交
      

  5.   

    非常感谢klyh(风笛)和beckhambobo(beckham)的回答,用beckhambobo(beckham)所提供的方法已达到了我的要求,我还想请教一下beckhambobo(beckham)前辈.
       我上面所列的表是一张在产品表,记录更新很频繁.上面所做的操作实际上是在产品的查询,而不是定期的统计,要求随时能查出上面所示的统计结果.针对这种情况,是用存储过程还是用您所提供的SQL语句来实现更有效?
       请赐教! 谢谢!
      

  6.   

    若是记录频繁,那最不用语句了,用临时间表实现比较适合.CREATE GLOBAL TEMPORARY TABLE TABLENAME (
       NAME varchar2(20),
       one  number,
       two  number,
       three number,
      ........,
       total  number  
    ) ON COMMIT PRESERVE(DELETE) ROWS ;
    /create or replace procedure name_pro
    as
    v_one number;
    v_two number;
    v_three number;
    v_four number;
    .....
    v_total number;
    cursor t1_sor is
    select distinct name from table_name;
    cursor t2_sor(p_name varchar2) is
    select sum(number) num from table_name where name=p_name group by class;
    begin
    delete from TABLENAME;
    for v1_sor in t1_sor loop
    for v2_sor in t2_sor(v1_sor.name) loop
    v_one:=v2_sor.class;
    v_two:=v2_sor.class;
    v_three:=v2_sor.class;
    v_four:=v2_sor.class;
    .....
    end loop;
    v_total:=v_one+v_two+v_three+v_four;
    insert into TABLENAME values(v1_sor.name,v_one,v_two,v_three,v_four,...,v_total);
    end loop;
    end;
    /还没测试.