用一句SQL写太复杂了,用存储过程处理简单的多;每个人用的动作次数(只能计算第一个动作):
select 姓名,动作,count(动作) 次数 from (
select 姓名,(case when instr(动作,';')!=0
then substr(动作,1,instr(动作,';')-1)
else 动作 end) 动作
from 表名
) group by 姓名,动作
order by 姓名,动作,次数 desc
select 姓名,动作,count(动作) 次数 from (
select 姓名,(case when instr(动作,';')!=0
then substr(动作,1,instr(动作,';')-1)
else 动作 end) 动作
from 表名
) group by 姓名,动作
order by 姓名,动作,次数 desc
照这写就行了,
www.pdwon.net 那里有的下。
/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;
还没测试,以上含有对象类型,请楼主细心理解
把上面的代码用SQL/PLUS写出来就可以了吗?
能不能加点注释,每一步是什么意思?
第一个/前是建立对象类型;
第二个/前是把一次多个动作拆成几个动作;
第三个/前是正式统计次数。
create or replace type mytabletype as table of number;
/