Oracle 联合查询后 如何对字段进行分组 ???
答案:3 悬赏:50
解决时间 2021-03-23 04:48
- 提问者网友:泪姬迷茫
- 2021-03-22 08:15
对 dept_id 和cost_scheme 这两个字段先后进行分组
最佳答案
- 二级知识专家网友:桃花别处起长歌
- 2021-03-22 09:11
select dept_id,cost_id,cost_scheme from tablename where rowid in (select min(rowid) from tablename group by dept_id,cost_scheme);
全部回答
- 1楼网友:孤伤未赏
- 2021-03-22 10:34
create table info (
users varchar(100)
);
insert into info values('usera@userb@userc');
insert into info values('userb@userc@userd');
insert into info values('userc@userd@usere');
column "用户" format a15
select
to_char(strvalue) as "用户",
count(*) as "用户数"
from
info,
table(fn_split( info.users, '@'))
group by
to_char(strvalue)
order by
1;
用户 用户数
--------------- ----------
usera 1
userb 2
userc 3
userd 2
usere 1
上面这样的效果, 是否满足你的需求?
如果满足的话, 你再往下看, 下面是 存储过程的相关代码
oracle 需要首先在数据库中, 创建好 类型 与 函数。
来实现一个 split 功能的处理。
-- 定义一个对象类型.
create or replace type ty_row_str_split as object (strvalue varchar2 (4000));
/
-- 定义一个 表/数组类型, 内容是前面定义的那个对象.
create or replace type ty_tbl_str_split is table of ty_row_str_split;
/
--------------------
-- 字符分割函数.
-- 参数1: 被分割的源字符串
-- 参数2: 用于拆分的字符串。
--------------------
create or replace function fn_split(
p_str in varchar2,
p_delimiter in varchar2)
return ty_tbl_str_split is
j int := 0;
i int := 1;
-- 被分割的源字符串 的长度.
len int := 0;
-- 分隔字符串的长度
len1 int := 0;
-- 暂存的中间每一个单元的文本信息.
str varchar2(4000);
-- 预期返回结果.
str_split ty_tbl_str_split := ty_tbl_str_split();
begin
-- 被分割的源字符串 的长度.
len := length(p_str);
-- 分隔字符串的长度.
len1 := length(p_delimiter);
-- 遍历 被分割的源字符串.
while j < len loop
-- 在被分割的源字符串中, 查询 分隔字符串.
j := instr(p_str, p_delimiter, i);
if j = 0 then
-- j=0 意味着没有找到.
-- 可以理解为是查询到最后一个单元了.
-- 设置 j := len, 让外部的循环处理可以结束了.
j := len;
-- 获取最后一个单元的内容.
str := substr(p_str, i);
-- 结果追加一行.
str_split.extend;
-- 设置结果内容.
str_split(str_split.count) := ty_row_str_split(strvalue => str);
if i >= len then
exit;
end if;
else
-- 如果在被分割的源字符串中,找到了 分隔字符串.
-- 首先,获取分割的内容.
str := substr(p_str, i, j - i);
-- 然后设置索引, 下一次再查找的时候,从指定的索引位置开始(不是从0开始找了)
i := j + len1;
-- 结果追加一行.
str_split.extend;
-- 设置结果内容.
str_split(str_split.count) := ty_row_str_split(strvalue => str);
end if;
end loop;
return str_split;
end fn_split;
/
函数创建完毕以后,可以开始做查询的处理.
sql> select to_char(strvalue) as value from table(fn_split('aa,bb,cc',','));
value
-------------------------------------------------------------------------------
aa
bb
cc
- 2楼网友:冷眼_看世界
- 2021-03-22 09:39
你这分组是什么条件,我怎么看不懂呢,你把结果解释一下,把结果中的每个字段什么意思写出来,不然不好回答
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯