`
vtyi
  • 浏览: 82188 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

数字求和问题字符串分组相加

阅读更多

数字8546把各个位数相加

create or replace function f_convertion(num in number) return number is --此处暂时考虑num_in为整数
num_in number(18,0);
num_out number(18,0) default 0;
begin
num_in := num;
dbms_output.put_line(num_in);

if length(num_in) <= 1 then
        return num_in;
end if;

for i in 1..length(num_in) loop
        num_out := num_out + floor(num_in / power(10,length(num_in)-1));
        num_in := substr(num_in, - length(num_in) + 1);
end loop;

return num_out;
end f_convertion;
/

select f_convertion(123456) from dual;

 

一般位数总是有限的,可以这样,
SQL> SELECT NVL(SUBSTRB('8546',-1,1),0)+
             NVL(SUBSTRB('8546',-2,1),0)+
             NVL(SUBSTRB('8546',-3,1),0)+
             NVL(SUBSTRB('8546',-4,1),0)+
             NVL(SUBSTRB('8546',-5,1),0)+
             NVL(SUBSTRB('8546',-6,1),0)+
             NVL(SUBSTRB('8546',-7,1),0)+
             NVL(SUBSTRB('8546',-8,1),0) 各个位数相加
       FROM DUAL;


各个位数相加
------------
          23

 

稍微改进一下:

create or replace function f_convertion(num_in in number) return number is --此处暂时考虑num_in为整数

num_out number(18,0) default 0;

begin

if length(num_in) <= 1 then
        return num_in;
end if;

for i in 1..length(num_in) loop
        num_out := num_out + substr(num_in,i,1);
end loop;

return num_out;

end f_convertion;
/


select f_convertion(123456) from dual;

F_CONVERTION(123456)
--------------------
                  21

 

SQL> SELECT SUM(NM) TOTAL
  2    FROM (SELECT SUBSTR(&innum, ROWNUM, 1) NM
  3            FROM DUAL CONNECT BY ROWNUM <= LENGTH(&innum))
  4  /

     TOTAL
----------
        10

SQL> set verify on
SQL>
SQL> SELECT SUM(NM) TOTAL
  2    FROM (SELECT SUBSTR(&innum, ROWNUM, 1) NM
  3            FROM DUAL CONNECT BY ROWNUM <= LENGTH(&innum))
  4  /
&innum: 1234
&innum: 1234

     TOTAL
----------
        10

SQL> /
&innum: 5678
&innum: 5678

     TOTAL
----------
        26

 

 

SQL> SELECT SUM(NM) TOTAL
  2    FROM (SELECT SUBSTR(&innum, ROWNUM, 1) NM
  3            FROM DUAL CONNECT BY ROWNUM <= LENGTH(&innum))
  4  /

     TOTAL
----------
        10

SQL> set verify on
SQL>
SQL> SELECT SUM(NM) TOTAL
  2    FROM (SELECT SUBSTR(&innum, ROWNUM, 1) NM
  3            FROM DUAL CONNECT BY ROWNUM <= LENGTH(&innum))
  4  /
&innum: 1234
&innum: 1234

     TOTAL
----------
        10

SQL> /
&innum: 5678
&innum: 5678

     TOTAL
----------
        26

 

字符串分组相加方法之总结


--创建测试表、添加测试数据

create table test(id varchar2(10),mc varchar2(50));
insert into test values('1','11111');
insert into test values('1','22222');
insert into test values('2','11111');
insert into test values('2','22222');
insert into test values('3','11111');
insert into test values('3','22222');
insert into test values('3','33333');
commit;

--方法一:


set serveroutput on size 1000000
declare
union_mc varchar2(200);
begin
for cur_a in(select distinct id from test) loop
for cur_b in(select mc from test where id=cur_a.id) loop
union_mc:=union_mc||cur_b.mc;
end loop;
dbms_output.put_line(cur_a.id||chr(9)||union_mc);
union_mc := '';
end loop;
end;
/

--方法二:

CREATE OR REPLACE function link(v_id varchar2)
return varchar2
is
union_mc varchar2(200);
begin
for cur in (select mc from test where id=v_id) loop
union_mc := union_mc||cur.mc;
end loop;
union_mc := rtrim(union_mc,1);
return union_mc;
end;
/

select id,link(id) from test group by id;

--方法三:

/*从Oracle 9i开始,开发者可以创建用户自定义的合计函数,除了PL/SQL外,还可以使用任何Oralce所支持的语言(如C++或者Java)来创建合计函数。 TYPE头定义必须包含ODCIAggregateInitialize、ODCIAggregateIterate、 ODCIAggregateMerge和ODCIAggregateTerminate这四个接口函数。*/

/*Initialize函数对数据组各个需要处理的字段各运行一次。自然的,我需要为每一个值准备一个新的清单,所以需要初始化持久变量list,这里初始化值为null。*/

/*Iterate函数处理返回的行,所以实际上是由它来创建返回的值的清单。先测试list是否为空,如果为空,就把list直接设置为所引入的 value值;如果list变量非空,则给list添加一个逗号后再插入value值,list的最大允许字符数32767。*/

/*Terminate函数在数据组的每个行的感兴趣字段数据被处理后执行。在这个函数中我只需简单的返回清单变量即可。*/

/*Merge函数,用来返回成功标记的。*/

/*创建自己的合计函数扩展了Oracle统计和文本处理能力。*/


create or replace type t_cat as object
(
union_mc VARCHAR2(200),
static function ODCIAggregateInitialize(sctx IN OUT t_cat) return number,
member function ODCIAggregateIterate(self IN OUT t_cat,value IN varchar2) return number,
member function ODCIAggregateTerminate(self IN t_cat,returnValue OUT varchar2, flags IN number) return number,
member function ODCIAggregateMerge(self IN OUT t_cat,ctx2 IN t_cat) return number
);

create or replace type body t_cat is
static function ODCIAggregateInitialize(sctx IN OUT t_cat )
return number is
begin
sctx := t_cat('');
return ODCIConst.Success;
end;

member function ODCIAggregateIterate(self IN OUT t_cat, value IN varchar2)
return number is
begin
self.union_mc := self.union_mc || value;
return ODCIConst.Success;
end;

member function ODCIAggregateTerminate(self IN t_cat, returnValue OUT varchar2, flags IN number) return number is
begin
returnValue := self.union_mc;
return ODCIConst.Success;
end;

member function ODCIAggregateMerge(self IN OUT t_cat , ctx2 IN t_cat ) return number is
begin
return ODCIConst.Success;
end;
end;
/

/*如果你的Oracle服务器没有配置成支持并行处理的方式,可以去掉参数PARALLEL_ENABLE*/

create or replace function catstr(v_mc varchar2) return varchar2 PARALLEL_ENABLE AGGREGATE USING t_cat;
/

select id,catstr(mc) from test group by id;


--方法四:
create table test(id varchar2(10),mc varchar2(50));
insert into test values('1','11111');
insert into test values('1','22222');
insert into test values('2','11111');
insert into test values('2','22222');
insert into test values('3','11111');
insert into test values('3','22222');
insert into test values('3','33333');

commit;

select id,mc,row_number() over(partition by id order by id) rn_by_id,
row_number() over (order by id) + id rn from test;

/*
利用分析函数,构造两列,做为连接的条件:按照id分组,RN-1等于PRIOR RN作为条件连接。
ID         MC                                                   RN_BY_ID         RN
---------- -------------------------------------------------- ---------- ----------
1          11111                                                       1          2
1          22222                                                       2          3
2          11111                                                       1          5
2          22222                                                       2          6
3          11111                                                       1          8
3          22222                                                       2          9
3          33333                                                       3         10
*/

select id,ltrim(max(sys_connect_by_path(mc,';')),';') add_mc from (
select id,mc,row_number() over(partition by id order by id) rn_by_id,
row_number() over (order by id) + id rn from test
)
start with rn_by_id = 1 connect by rn - 1 = prior rn
group by id
order by id;

/*
另用sys_connect_by_path函数实现字符串的连接,把最左边的分号去掉,即得到我们想要的结果
ID         ADD_MC
---------- --------------------------------------------------------------------------------
1          11111;22222
2          11111;22222
3          11111;22222;33333
*/

select * from test;

 

 

估计类似的写法还有很多,这个和上一个不同在于用的没有带有start with(filter功能)的connect,并借助level和first_value来实现。

SELECT distinct id,ltrim(first_value(mc_add) over (partition by id order BY l DESC),';')
from (
SELECT id,LEVEL l,sys_connect_by_path(mc,';') mc_add from
(
select id||rownum rn,id||rownum-1 rn_small,id,mc from test
)
CONNECT BY PRIOR rn = rn_small
)
;

 

 

变换一下:(考虑id不是数字的情况)

select id,ltrim(max(sys_connect_by_path(mc,';')),';') from(
select id,mc,row_number() over(partition by id order by id) id1,
row_number() over(order by id) + dense_rank() over(order by id) id2
from test
)
start with id1=1 connect by prior id2 = id2 -1
group by id order by id;

评论

相关推荐

    cad 字符串里自动提取数字求和

    cad 字符串里自动提取数字求和,过滤掉文字,字符等无用的东西,,找了半天才找到这个,而不是那些无用的纯数字求和lsp程序,比如cad画系统图,从各种英文中文语句里提取数字相加,这就是你想要的

    python 将字符串中的数字相加求和的实现

    主要介绍了python 将字符串中的数字相加求和的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    String类型数字相加不损失精度

    两个String类型的数字相加,不损失精度,自己粗略写了个算法,如果有兴趣可以参考一下。

    VBA常用技巧

    技巧6替换单元格内字符串24 技巧7复制单元格区域25 技巧8仅复制数值到另一区域28 8-1使用选择性粘贴28 8-2直接赋值的方法29 技巧9单元格自动进入编辑状态30 技巧10禁用单元格拖放功能30 技巧11单元格格式操作31 11-1...

    python100例.zip

    实例017:字符串构成 实例018:复读机相加 实例019:完数 实例020:高空抛物 实例021:猴子偷桃 实例022:比赛对手 实例023:画菱形 实例024:斐波那契数列II 实例025: 阶乘求和 实例...

    通过在VS中编程实现父子进程的管道通信.zip

    通过在VS中编程,实现父子进程的管道通信,要求父进程从窗口中输入数字,输入的数字通过管道传输给子进程,子进程将输入的字符串进行相加求和,同时打开readme.txt文件计算完成后读取文档中的一行,最后以 和_文档某...

    freecodecamp-algorithms:我在freeCodeCamp上针对JavaScript算法的解决方案

    重复一个字符串重复一个字符串 截断字符串 寻找者守护者 嘘谁 标题案例一句 切片和拼接 虚假的保镖 我在哪里 变异 矮胖的猴子 中级算法脚本 对范围内的所有数字求和 区分两个数组 寻找和摧毁 因此你 ...

    我整理的VBA 自定义函数大全 共138页

    4.从形如"123545ABCDE"的字符串中取出数字 5.从形如"ABCD12455EDF"的字符串中取出数字 6.按SplitType取得RangeName串值中的起始位置 7.将金额数字转成中文大写 8.计算某种税金 9.人民币大、小写转换 10.查汉字区位码...

    EXCEL函数公式集

    数字在字符串中不连续如何提取数字 用如何提取“-”前后的字符 怎样删去﹕后的文字 怎样只取“.”之后的文字﹖ 获取单元格内容中字符串 如何提取一串数字中的几位数字(字符) 如何把一个单元格中的数字挑出来 分割...

    Excel公式大全操作应用实例(史上最全)

    数字在字符串中不连续如何提取数字 用如何提取“-”前后的字符 怎样删去﹕后的文字 怎样只取“.”之后的文字﹖ 获取单元格内容中字符串 如何提取一串数字中的几位数字(字符) 如何把一个单元格中的数字挑出来 分割...

    javascript文档

    + 运算符 将两个数字表达式的值相加,或连接两个字符串。 ++ 运算符 变量值加 1。 += 运算符 将表达式的值加到变量中。 , 运算符 使两个表达式按顺序执行。 - 运算符 从一个表达式中减去另一个表达式的值,或对...

    JScript 语言参考

    + 运算符 将两个数字表达式的值相加,或连接两个字符串。 ++ 运算符 变量值加 1。 += 运算符 将表达式的值加到变量中。 , 运算符 使两个表达式按顺序执行。 - 运算符 从一个表达式中减去另一个表达式的值,或对...

    微软JavaScript手册

    + 运算符 将两个数字表达式的值相加,或连接两个字符串。 ++ 运算符 变量值加 1。 += 运算符 将表达式的值加到变量中。 , 运算符 使两个表达式按顺序执行。 - 运算符 从一个表达式中减去另一个表达式的值,或对...

    labview数值位数求和

    对于100以内字符串数值,各个位数相加求和。

    Python100道经典练习题,建议收藏.pdf

    实例010:给⼈看的时间 实例011:养兔⼦ 实例012:100到200的素数 实例013:所有⽔仙花数 实例014:分解质因数 实例015:分数归档 实例016:输出⽇期 实例017:字符串构成 实例018:复读机相加 实例019:完数 实例...

    2014华为编程大赛第二轮(2场)

    外星人使用的并非10进制/16进制等,有些星球居然使用N进制(据统计N都在2~35之间),现在我们将首先给您一个数字表示N进制,然后给出两个数字的字符串,请算出其求和结果并输出,如果输入不能正常计算则输出-1。...

    Python基础训练100题(带答案).docx

    本教程来自网友总结整理,这个习题...实例017:字符串构成 实例018:复读机相加 实例019:完数 实例020:高空抛物 实例021:猴子偷桃 实例022:比赛对手 实例023:画菱形 实例024:斐波那契数列II 实例025: 阶乘求和

    leetcode:这是一个leetcode解决问题的项目,已通过go完成

    字符串转换整体(atoi) myAtoi 0013 罗马数字转整体 罗马人 0014 最高公共预算 longestCommonPrefix 0017 电话号码的字母组合 letterCombinations 0018 四数之和 四和 0019 删除链表的倒数第N个

    用Python的pandas框架操作Excel文件中的数据教程

    作为额外的福利,我将会进行一些模糊字符串匹配,以此来展示一些小花样,以及展示pandas是如何利用完整的Python模块系统去做一些在Python中是简单,但在Excel中却很复杂的事情的。 有道理吧?让我们开始吧。 为某行...

Global site tag (gtag.js) - Google Analytics