用一句SQL写太复杂了,用存储过程处理简单的多;每个人用的动作次数(只能计算第一个动作):
select 姓名,动作,count(动作) 次数 from (
    select 姓名,(case when instr(动作,';')!=0
                      then substr(动作,1,instr(动作,';')-1)
                      else 动作 end) 动作
    from 表名
) group by 姓名,动作
  order by 姓名,动作,次数 desc

解决方案 »

  1.   

    在CSDN里搜索‘存储过程’关键字,就可以找到以前的帖子了
    照这写就行了,
      www.pdwon.net 那里有的下。
      

  2.   

    create or replace type mytabletype as table of number;
    /create or replace function strtab(p_str in varchar2)
    return mytabletype
    as
    lstr varchar2(1000) default p_str;
    ln   number;
    ldata   mytabletype:=mytabletype();
    begin
    loop
      ln:=instr(lstr,';');
      exit when (nvl(ln,0)=0);
      ldata.extend;
      ldata(ldata.count):=ltrim(rtrim(substr(lstr,1,ln-1)));
      lstr:=substr(lstr,ln+1);
    end loop;
    return ldata;
    end;
    /create function get(p_id in varchar2)
    return varchar2
    as
    str varchar2(100);
    cursor t1_sor is
    select 动作 from table_name where id=p_id;
    begin
    for v1_sor in t1_sor loop
    str:=str||v1_sor.动作||';';
    end loop;
      begin
      declare
      v_num number:=0;
      ret_str varchar2(10);
      cursor t2_sor is
      select COLUMN_VALUE,count(1) num from table(cast(strtab(str) as mytabletype)) group by COLUMN_VALUE;
      begin
      for v2_sor in t2_sor loop
      if v_num<v2_sor.num then
      v_num:=v2_sor.num;
      ret_str:=v2_sor.COLUMN_VALUE;
      end if;
      end loop;
      end;
      end;
    return ret_str;
    end;
    /select id,get(id) from table_name group by id;
      
    还没测试,以上含有对象类型,请楼主细心理解
      

  3.   

    这个我不知道如何进行测试。
    把上面的代码用SQL/PLUS写出来就可以了吗?
    能不能加点注释,每一步是什么意思?
      

  4.   

    把表名替换成你自己的,放到sqlplus中执行一下, 看看。
    第一个/前是建立对象类型;
    第二个/前是把一次多个动作拆成几个动作;
    第三个/前是正式统计次数。
      

  5.   

    robinhz的已经成功了我再试试bechham的
      

  6.   

    楼主忘记了"/"符号了,在SQL/PLUS WORKSHEET执行程序,结尾处加"/"符号.
      

  7.   

    但是它说权限不够
    create or replace type mytabletype as table of number;
    /