【问题标题】:user defined custom aggregate function using plsql使用 plsql 的用户定义的自定义聚合函数
【发布时间】:2012-11-06 23:38:45
【问题描述】:

我有一个问题。我使用的工具不接受子查询。所以我必须编写一个用户定义的自定义聚合函数来执行以下操作。

示例:col1 和 col2 具有数字数据类型。

**col1**    **col2**
243         401
57489       400
2789        401
598         400

SELECT sum(MinValue) 
FROM
    (SELECT Min(col1) AS MinValue,col2
    FROM
    Table1
    GROUP BY col2)

Output:841

我希望此查询通过使用单个函数而不是如上所示的查询在一个步骤中工作。比如:

SELECT MyMinSum(col1, col2),col3 from table1 Group by col3;

我希望这是有道理的。对此我将不胜感激。

【问题讨论】:

    标签: oracle plsql oracle10g


    【解决方案1】:

    如果您正在寻找与使用子查询的选择语句相同的输出,您可以通过

    获得相同的结果
             SELECT   SUM (MIN (col1)) AS minvalue
     FROM   Table1
    GROUP BY   col2
    

    【讨论】:

      【解决方案2】:

      最好的方法可能是将你的 SQL 放在一个视图中,假设它适用于你的工具。

      但如果您真的需要自定义聚合函数,有两种主要方法可以实现。典型的方式是使用Oracle Data Cartridge Interface,比如流行的STRAGG。但根据我的经验,Data Cartridge 令人困惑,充满了 bug,而且速度很慢。通常COLLECT 函数效果更好。请参阅下面的示例,或此SQL Fiddle

      create table table1(col1 number, col2 number, col3 number)
      /
      
      insert into table1
      select 243,   401, 1 from dual union all
      select 57489, 400, 1 from dual union all
      select 2789,  401, 1 from dual union all
      select 598,   400, 1 from dual union all
      select 598,   400, 2 from dual
      /
      
      create or replace type col1_col2_obj is object
      (
        col1 number,
        col2 number
      )
      /
      
      create or replace type col1_col2_nt is table of col1_col2_obj
      /
      
      create or replace function MyMinSum(p_col1_col2_nt in col1_col2_nt)
      return number is
        v_result number;
      begin
        SELECT sum(MinValue)
        INTO v_result
        FROM
        (
          SELECT Min(col1) AS MinValue,col2
          FROM
          table(p_col1_col2_nt)
          GROUP BY col2
        );
      
        return v_result;
      end;
      /
      
      select
        MyMinSum(cast(collect(col1_col2_obj(col1, col2)) as col1_col2_nt)) test
        ,col3
      from table1
      group by col3
      /
      
      
      TEST    COL3
      841     1
      598     2
      

      【讨论】:

        猜你喜欢
        • 2015-07-04
        • 2017-10-13
        • 2019-03-06
        • 1970-01-01
        • 2015-12-03
        • 1970-01-01
        • 2015-07-06
        • 2023-03-26
        • 1970-01-01
        相关资源
        最近更新 更多