4

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

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

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

4

2 回答 2

1

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

         SELECT   SUM (MIN (col1)) AS minvalue
 FROM   Table1
GROUP BY   col2
于 2012-11-07T05:37:15.840 回答
0

最好的方法可能是将您的 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
于 2012-11-12T15:04:15.020 回答