本文参考网址:http://www.itpub.net/thread-1020772-1-1.html

我们在日常的工作中,经常遇到了针对某一列的值,进行求和,求平均值,在一些特殊的业务场景下,我们需要对某一列进行求积操作,那我们该如何实现呢,下面先介绍,我

们对字符串的求和操作。

针对字符串的求和操作:

1、有分隔符的字符串:

 SELECT STR, SUM(STR) OVER(ORDER BY LV ASC) AS RS
FROM (SELECT REGEXP_SUBSTR('1,2,3,4,5', '[^,]+', 1, LEVEL) AS STR,
LEVEL AS LV
FROM DUAL
CONNECT BY LEVEL <=
LENGTH(REGEXP_REPLACE('1,2,3,4,5', '[^,]', '')) + 1) COLS

结果:
 

2、没有分割符符号的:

       SELECT STR, SUM(STR) OVER(ORDER BY LV ASC) AS RS
FROM (SELECT SUBSTR('', LEVEL, 1) STR, LEVEL AS LV
FROM DUAL
CONNECT BY LEVEL <= LENGTH(12345)) COLS

结果:

下面介绍连续求积的方法

SUM()是个求和的聚合函数,如何求积呢?我们可以想办法把乘法变成加法:

A*B*C = 10^(LOG(A)+LOG(B)+LOG(C))

1、直接使用对数和反对数来进行求积,即:LOG和POWER函数

 SELECT STR, POWER(10, SUM(LOG(10, STR)) OVER(ORDER BY STR))
FROM (SELECT REGEXP_SUBSTR('1,2,3,4,5', '[^,]+', 1, LEVEL) AS STR,
LEVEL AS LV
FROM DUAL
CONNECT BY LEVEL <=
LENGTH(REGEXP_REPLACE('1,2,3,4,5', '[^,]', '')) + 1) COLS

结果:

2、使用PL/SQL的自定义函数来实现该功能

 CREATE OR REPLACE FUNCTION GET_EXPRESSION_RSLT(I_EXPRESSION VARCHAR2) RETURN VARCHAR2 IS
/************************************************************
* 函数名称:GET_EXPRESSION_RSLT
* 功能描述:获取指定的表达式的结果
* 参数:I_EXPRESSION :表达式 例如:1*2*3
* 编 写 人:XXX
* 编写时间:XXXX-XX-XX
* 修改记录:
*************************************************************/
RETURNSTR VARCHAR2(500) := '';
EXECSQL VARCHAR2(4000) := '';
BEGIN
EXECSQL := ' SELECT ' || I_EXPRESSION || ' FROM DUAL';
EXECUTE IMMEDIATE (EXECSQL)
INTO RETURNSTR;
RETURN RETURNSTR;
END;

SQL:

 SELECT STR,
GET_EXPRESSION_RSLT(REPLACE(WM_CONCAT(STR) OVER(ORDER BY STR),
',',
'*')) RS
FROM (SELECT REGEXP_SUBSTR('1,2,3,4,5', '[^,]+', 1, LEVEL) AS STR,
LEVEL AS LV
FROM DUAL
CONNECT BY LEVEL <=
LENGTH(REGEXP_REPLACE('1,2,3,4,5', '[^,]', '')) + 1) COLS

结果:

但是,使用这种方法:newid这个大拿给出了不使用该种方法的建议:

SELECT A*B*C... FROM DUAL;

都是常量且个数不定,每次都需要硬解析,所以不推荐。

下面是tom对使用wm_concat函数的看法:

http://asktom.oracle.com/pls/ask ... #548923200346634568

Hi Tom,

I saw wm_concat on a couple of forums (otn and orafaq), apparently a new, undocumented function as
shown below.  Since it is undocumented, is it safe to use?

Regards,
Barbara

Followup   November 20, 2007 - 2pm US/Eastern:

my suggestion is going to be consistent....

Never use undocumented stuff, it is subject to change, removal, broken-ness without recourse.

either

a) use stragg
b) write your own
c) use the connect by trick.

3、使用自定义的聚合函数

安德森

 CREATE OR REPLACE TYPE PROD_AGG_TYPE AS OBJECT
(
TOTAL NUMBER, STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT PROD_AGG_TYPE)
RETURN NUMBER, MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT PROD_AGG_TYPE,
VALUE IN NUMBER) RETURN NUMBER, MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN PROD_AGG_TYPE,
RETURNVALUE OUT NUMBER,
FLAGS IN NUMBER)
RETURN NUMBER, MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT PROD_AGG_TYPE,
CTX2 IN PROD_AGG_TYPE) RETURN NUMBER
)
/
CREATE OR REPLACE TYPE BODY PROD_AGG_TYPE IS STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT PROD_AGG_TYPE)
RETURN NUMBER IS
BEGIN
SCTX := PROD_AGG_TYPE(NULL);
SCTX.TOTAL := 1;
RETURN ODCICONST.SUCCESS;
END; MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT PROD_AGG_TYPE,
VALUE IN NUMBER) RETURN NUMBER IS
BEGIN
SELF.TOTAL := SELF.TOTAL * VALUE;
RETURN ODCICONST.SUCCESS;
END; MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN PROD_AGG_TYPE,
RETURNVALUE OUT NUMBER,
FLAGS IN NUMBER) RETURN NUMBER IS
BEGIN
RETURNVALUE := SELF.TOTAL;
RETURN ODCICONST.SUCCESS;
END; MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT PROD_AGG_TYPE,
CTX2 IN PROD_AGG_TYPE) RETURN NUMBER IS
BEGIN
SELF.TOTAL := SELF.TOTAL * CTX2.TOTAL;
RETURN ODCICONST.SUCCESS;
END; END;
/

函数:

CREATE OR REPLACE FUNCTION prod_agg(input NUMBER )
RETURN NUMBER
PARALLEL_ENABLE AGGREGATE USING prod_agg_type;

SQL:

  SELECT STR, prod_agg(STR) OVER(ORDER BY LV ASC) AS RS
FROM (SELECT SUBSTR('', LEVEL, 1) STR, LEVEL AS LV
FROM DUAL
CONNECT BY LEVEL <= LENGTH(12345)) COLS

结果:

Oracle聚合求和和聚合求积(顺便解决BOM展开的问题)的更多相关文章

  1. 【软件实施面试】MySQL和Oracle联合查询以及聚合函数面试总结

    软件实施面试系列文章第二弹,MySQL和Oracle联合查询以及聚合函数的面试总结.放眼望去全是MySQL,就不能来点Oracle吗?之前面过不少公司,也做过不少笔试题,现在已经很少做笔试题了.你肚子 ...

  2. SQL Server聚合函数与聚合开窗函数 (转载)

    以下面这个表的数据作为示例. 什么是聚合函数?聚合函数:聚合函数就是对一组值进行计算后返回单个值(即分组).聚合函数在计算时都会忽略空值(null).所有的聚合函数均为确定性函数.即任何时候使用一组相 ...

  3. SQL Server聚合函数与聚合开窗函数

    以下面这个表的数据作为示例. 什么是聚合函数? 聚合函数:聚合函数就是对一组值进行计算后返回单个值(即分组).聚合函数在计算时都会忽略空值(null). 所有的聚合函数均为确定性函数.即任何时候使用一 ...

  4. ElasticSearch 2 (33) - 信息聚合系列之聚合过滤

    ElasticSearch 2 (33) - 信息聚合系列之聚合过滤 摘要 聚合范围限定还有一个自然的扩展就是过滤.因为聚合是在查询结果范围内操作的,任何可以适用于查询的过滤器也可以应用在聚合上. 版 ...

  5. Elasticsearch(9) --- 聚合查询(Bucket聚合)

    Elasticsearch(9) --- 聚合查询(Bucket聚合) 上一篇讲了Elasticsearch聚合查询中的Metric聚合:Elasticsearch(8) --- 聚合查询(Metri ...

  6. ElasticSearch的高级复杂查询:非聚合查询和聚合查询

    一.非聚合复杂查询(这儿展示了非聚合复杂查询的常用流程) 查询条件QueryBuilder的构建方法 1.1 精确查询(必须完全匹配上,相当于SQL语句中的“=”) ① 单个匹配 termQuery ...

  7. hive常用函数 wordCount--Hive窗口函数1.1.1 聚合开窗函数聚合开窗函数实战

    第三天笔记 第三天笔记 SQL练习Hive 常用函数关系运算数值计算条件函数日期函数重点!!!字符串函数Hive 中的wordCount1.1 Hive窗口函数1.1.1 聚合开窗函数聚合开窗函数实战 ...

  8. Loadrunner参数化连接oracle、mysql数据源报错及解决办法

    Loadrunner参数化连接oracle.mysql数据源报错及解决办法 (本人系统是Win7 64,  两位小伙伴因为是默认安装lr,安装在 最终参数化的时候,出现连接字符串无法自动加载出来: 最 ...

  9. Oracle ORA-01033: ORACLE initialization or shutdown in progress 错误解决办法

    Oracle ORA-01033: ORACLE initialization or shutdown in progress 错误解决办法 登陆数据库时提示 “ORA-01033”错误在命令窗口以s ...

随机推荐

  1. iOS中通知传值

    NSNotification 通知中心传值,可以跨越多个页面传值, 一般也是从后面的页面传给前面的页面.   思路: 第三个界面的值传给第一个界面. 1. 在第一个界面建立一个通知中心, 通过通知中心 ...

  2. CocoaPods的安装及安装出现问题的处理

    ocoaPods安装分两步:第一步.修改本机的Ruby环境:第二步.安装. 第一步:步骤1.打开终端输入   gem sources -l   查看本机的Ruby环境:若显示“https://ruby ...

  3. python 的一些高级编程技巧

    正文: 本文展示一些高级的Python设计结构和它们的使用方法.在日常工作中,你可以根据需要选择合适的数据结构,例如对快速查找性的要求.对数据一致性的要求或是对索引的要求等,同时也可以将各种数据结构合 ...

  4. react-native component function

    examples: use:

  5. jquery实现隐藏显示层动画效果、仿新浪字符动态输入、tab效果

    已经有两年多没登陆csdn账号了,中间做了些旁的事,可是现在却还是回归程序,但改做前端了,虽然很多东西都已忘得差不多了,但还是应该摆正心态,慢慢来,在前端漫游,做一只快乐双鱼. 路是一步一步走出来的, ...

  6. C# 如何利用反射来加载程序集,并调用程序集中有关类的方法【转】

    假设在C盘根目录下有个Dog的Dll程序集文件,该程序集文件中包含类Dog 该类中有个狗叫几声的方法,如何通过反射来加载这个C:\Dog.dll,并且调用Dog类里面的Sound方法呢: public ...

  7. 机顶盒加密系统流程 ECM EMM CW SK

    随着数字视频广播(DVB)的发展.观众将面对数字电视节目的选择多.广播业因为投资成本增加,这是需要收取费用的用户观看. 有条件接收系统(Conditional Access System).它的主要功 ...

  8. 关于sizeof()和内存对齐

    PS补充:枚举类型的字节数为什么为4 百度知道回答: typedef enum e1{ MON, TUE, THI, }e; e1是一个数值,它的允许值范围是: MON,TUE,THI, 它的取值为其 ...

  9. cocos2dx中包含svn

    因为不想从svn上载下整个工程,就只把Classes和Resources载下来了,在打安卓包时出现WindowsError: [Error 5] : 'D:\\CocosProject\\(Proje ...

  10. Grunt之学习历程(转自网上资源-整理自用)

    认识Grunt Grunt中文文档 安装Node环境 CNode 配置Grunt Grunt中文文档-配置任务 什么是package.json package.json中文文档 关于Grunt资料 应 ...