本文参考网址: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. 剖析magento中关于Email模板的设置

    public function send()    {        $emailTemplate = Mage::getModel('core/email_template');        // ...

  2. XCode 7上传遇到ERROR ITMS-90535 Unexpected CFBundleExecutable Key. 的解决办法(转)

    原文:http://blog.csdn.net/wxs0124/article/details/48706685 找到腾讯的info.plist 删除箭头指向的一行 重新打包,上传. (注明,不一定是 ...

  3. navigationController显示隐藏问题

    今天遇到设置: self.navigationController.navigationBarHidden= YES; 点击返回上一个UIViewController的时候这个时候这个navigati ...

  4. PHP与MySQL交互

    <?php $con = mysql_connect("localhost","root","12345"); $dbcharset ...

  5. C# - 自定义 DataSet 的使用

    -------------------------------------------------  SellProdectManager.cs  -------------------------- ...

  6. BOOST CHRONO steadycolock::now分析

    一直觉得boost的时间库不是很好用,当然,也有可能是我没有深入理解,所以,把代码弄出来看看或许要好些,时间处理中,取当前时间真的是太常见,而boost中各种clock又区分不清楚,然而,代码能说明一 ...

  7. leetcode Binary Tree Paths python

    # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = ...

  8. Linux 学习之防火墙配置

    1.安装iptables防火墙 yum install iptables  2. 清除已有的iptables规则  iptables -F  iptables -X  iptables -Z  3.显 ...

  9. iOS移动支付——支付宝支付

    这篇博客总结得很好,我只对在iOS上集成支付宝做简洁的步骤总结. http://www.it165.net/pro/html/201402/9376.html iOS集成支付宝支付的步骤: 准备工作的 ...

  10. You have not agreed to the Xcode license.

    You have not agreed to the Xcode license. Before running the installer again please agree to the lic ...