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

당신이 하위 쿼리를 사용하여 선택 문을 얻고있는 것 같은 출력을 찾고 있다면, 당신이 가장 좋은 방법은 아마보기에서 SQL을 넣어하는 것입니다

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

하여 동일한 결과를 얻을 수있다, 귀하의 도구와 함께 작동한다고 가정합니다.

하지만 실제로 사용자 지정 집계 함수가 필요한 경우 두 가지 주요 방법이 있습니다. 일반적인 방법은 STRAGG과 같이 Oracle Data Cartridge Interface을 사용하는 것입니다. 그러나 제 경험상 데이터 카트리지는 혼란스럽고 버그가 많으며 느립니다. 보통 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 
관련 문제