`
vtyi
  • 浏览: 84387 次
  • 性别: 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 字符串里自动提取数字求和"是一个涉及CAD编程和LISP语言的问题,它需要利用编程技巧来解决实际工作中的数据处理需求。通过理解和应用上述概念,你可以创建自己的工具,优化CAD工作流程,提高工作效率...

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

    这个任务可以通过编写一个函数来实现,该函数能够识别字符串中的数字部分,并将它们相加。以下是一个名为`sum_str`的函数,它实现了这一功能: ```python def sum_str(str1): len1 = len(str1) # 获取字符串str1的...

    python实现将字符串中的数字提取出来然后求和

    【Python字符串数字提取与求和】 在Python编程中,经常需要处理包含混合内容的字符串,例如,一个字符串可能由字母、数字和特殊字符组成。在某些情况下,我们需要从这样的字符串中提取出所有的数字并计算它们的总和...

    Python 字符串相加,用 join 比 sum 快20倍!

    本文将探讨一个重要的性能优化技巧:在字符串相加操作中,使用`join`方法通常比使用`sum`函数更快,尤其是在处理大量字符串时。这个差异可能对代码执行效率产生显著影响,对于追求代码性能的开发者来说,了解这一...

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

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

    文字内数字相加.rar

    这可能涉及到字符串操作,如使用`strtok`函数分隔字符串,并用`vl-string-to-real`将每个数字部分转换为浮点数。一旦数字被提取,就可以使用循环结构(如`do`或`while`)和累加器变量来完成求和。 对于“文字内数字...

    C 代码 计算字符串的 Luhn 校验位,或验证字符串, 用于信用卡号中的错误检测.rar

    4. **求和**:将未处理的数字(即偶数位置的数字)和处理过的数字(奇数位置的数字的加权和)相加。 5. **模10除法**:将上述总和对10取模。如果余数为0,则原始数字串有效;否则,无效。 6. **验证校验位**:如果...

    VB将16进制字符串转为10进制校验和代码.rar

    在这个例子中,校验和的计算方法是将16进制字符串的每个字符转换成10进制,然后将这些数值相加。为了去除字符串中的空格、回车和换行符,我们可以使用字符串函数,如`Replace`,来替换或删除这些非数字字符。 以下...

    几个经典的字符串哈希函数及测试.rar

    1. **简单除法哈希**:最基础的哈希函数之一,将字符串的每个字符的ASCII码相加,然后除以哈希表的大小,取余数作为哈希值。这种方法简单,但容易产生冲突。 2. **乘法哈希**:使用一个常数乘以字符串的每个字符的...

    求位数相加_计算四位数字的各位之和_

    由于我们已经将数字转换为字符串,所以可以直接将字符转换为对应的整数值。例如,字符'1'代表1,'2'代表2,以此类推。 4. **累加求和**:将提取出的每一位数字累加到总和中。在每次迭代中,将当前位的值加到一个...

    Python3数字求和的实例

    在这个示例中,我们首先使用`input()`函数获取用户输入的两个数字,然后通过`float()`函数将这两个字符串类型的数字转换成浮点数,最后使用加号(`+`)运算符来完成求和操作。 ##### 示例2:简化版数字求和程序 ```...

    javascript字符串拆分成单个字符相加和不超过10,求最终值第1/2页

    在这篇文章中,作者详细...文章涉及了字符串遍历、字符转数字、数字求和、数字拆分处理、函数封装、输出结果、字符串到数组的转换、循环条件与终止、整除与取模运算的应用以及数字和的累加等多个JavaScript编程知识点。

    多位十进制数相加求和显示

    - `mov ah, 9h`: 设置AH寄存器为9H,准备显示字符串。 - `int 21h`: 触发中断调用,显示指定的字符串。 #### 6.4 结束程序 - `mov ah, 4ch`: 设置AH寄存器为4CH,准备结束程序。 - `int 21h`: 触发中断调用,结束...

    java-leetcode题解之第67题二进制求和.zip

    第67题是关于二进制求和的问题,这通常涉及到位操作和字符串处理。 在这个压缩包文件中,我们可能找到一个或多个Java源代码文件,这些文件包含了对第67题的解答。描述中的“java_leetcode题解之第67题二进制求和”...

    JavaScript实现在数组中查找不同顺序排列的字符串

    为了解决这个问题,代码还检查了当前字符串的第一个字符是否在之前遇到的字符串中出现,以避免错误地将它们分组在一起。 接下来,我们看第二种方法: ```javascript var stringClassify = function() { var ...

    二进制求和1

    LeetCode上的这道题目“二进制求和1”要求开发者通过编程实现一个特定功能:将两个输入的二进制字符串相加,并返回它们的和,同样以二进制字符串形式表示。 首先,二进制数是一种基数为2的数制,使用两个符号0和1来...

    c语言编程题之数学各位相加.zip

    这个问题是一个经典的算法题目,它涉及到数字处理、字符串操作和循环控制等基本编程概念。下面我们将详细探讨如何用C语言解决这个任务。 首先,我们需要明白,一个整数在计算机中是以二进制形式存储的,而我们要...

    原生JS数字加减法计算求和代码.zip

    如果其中一个操作数是字符串,JavaScript会尝试将其转换为数字进行运算,这就是著名的类型转换特性。例如,`"1" + "2"` 结果为 `"12"`,而 `1 + "2"` 结果为 `3`。 2. **减法运算符 (-)**:用于数字相减。例如,`5 ...

    基础汇编程序(1)多位十进制数相加求和显示

    ### 基础汇编程序(1):多位十进制数相加求和显示 在计算机科学领域,汇编语言是一种低级编程语言,它为程序员提供了对硬件的直接控制能力,通常用于编写系统软件、设备驱动以及性能敏感的应用程序。本篇文章将...

Global site tag (gtag.js) - Google Analytics