单字段(多个值用逗号分隔),怎么统计?

wsgws 2003-10-15 11:13:42
要统计工作量
表:work
ID name
1 张三,李四,王五
2 张三 ,王五
3 王五
4 王五,李四

结果:
name times(次数)
张三 2
李四 2
王五 4
...全文
517 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
beckhambobo 2003-10-15
  • 打赏
  • 举报
回复
create or replace type mytabletype as table of varchar2;
/

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;
/

SQL> select * from table(cast(strtab('11,12,13') as mytabletype));

COLUMN_VALUE
------------
11
12
13

create function get_times(p_name in varchar2)
return number
as
type t_rc is ref cursor;
v_rc t_rc;
str varchar2(50);
v_name varchar2(50);
v_num number:=0;
cursor t_sor is
select name from work;
begin
for v_sor in t_sor loop
str:='select * from table(cast(strtab('||v_sor.name||') as mytabletype))';
open v_rc for str;
loop
fetch v_rc into v_name;
exit when v_rc%notfound;
if v_name=p_name then
v_num:=v_num+1;
end if;
end loop;
colse v_rc;
end loop;
return v_num;
end;
/

select a.name,get_times(a.name) from (select * from table(cast(strtab(select name from (select * from work order by length(name) desc) where rownum<2) as mytabletype))) a;
bzszp 2003-10-15
  • 打赏
  • 举报
回复
sorry
假设最大包含三个人名

select a,count(1) times from(
select substr(name,instr(name,',',1,1)+1,instr(name,',',1,2)-instr(name,',',1,1)-1) a from work
union all
select substr(name,instr(name,',',1,2)+1,instr(name,',',1,3)-instr(name,',',1,2)-1) a from work
union all
select substr(name,instr(name,',',1,3)+1,instr(name,',',1,4)-instr(name,',',1,3)-1) a from work)
group by a;
bzszp 2003-10-15
  • 打赏
  • 举报
回复
select a,count(1) times from(
select substr(name,1,2) a from work
union all
select substr(name,4,2) a from work
union all
select substr(name,7,2) a from work)
group by a;


pengdali 2003-10-15
  • 打赏
  • 举报
回复
应为写管了sql多写了个go 不好意思。
pengdali 2003-10-15
  • 打赏
  • 举报
回复
呵呵。。

create table dali."work" ("id" int,"name" varchar2(4000));
insert into dali."work" values(1,'张三,李四,王五');
insert into dali."work" values(2,'张三,王五');
insert into dali."work" values(3,'王五');
insert into dali."work" values(4,'王五,李四');
go

select "name",sum(1) 合计 from (select substr(','||aa."name",num+1,instr(','||aa."name"||',',',',num+1)-num-1) "name" from dali."work" aa,(select rownum num from all_objects where rownum<=4000) bb where substr(','||aa."name",num,8000) like ',_%') group by "name";
wsgws 2003-10-15
  • 打赏
  • 举报
回复
请问pengdali: 怎么写,谢谢
pengdali 2003-10-15
  • 打赏
  • 举报
回复
应该只要一句可以搞定。

17,075

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧