2012-11-06 189 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