2012-11-06 165 views
4

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

示例: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; 

我希望它是有道理的。我会很感激这方面的任何投入。

回答

1

如果你正在寻找相同的输出使用的是子查询与您的select语句得到什么,你可以实现通过

  SELECT SUM (MIN (col1)) AS minvalue 
FROM Table1 
GROUP BY col2 
0

相同的结果,最好的办法可能是把你的SQL视图中,假设可以和你的工具一起使用。

但是,如果你真的需要一个自定义的聚合函数,有两种主要的方法来做到这一点。典型的方法是使用Oracle Data Cartridge Interface,比如流行的STRAGG。但根据我的经验,Data Cartridge令人困惑,充满了错误,而且速度很慢。通常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