Re: Аггрегат над стрингами
- From
- Roman Miroshnichenko (2:5020/400)
- To
- Roman Miroshnichenko (2:5054/37.63)
- Date
- 2005-04-07T08:49:50Z
- Area
- RU.RDBMS.ORACLE
From: "Roman Miroshnichenko" <mir@cbsd.donetsk.ua>
On Wed, 6 Apr 2005 11:42:11 +0000 (UTC), Roman Miroshnichenko
<mir@cbsd.donetsk.ua> wrote:
Добрый день еще раз!
С Великим праздником всех Вас!
> Допустим, есть таблица со значениями
> 01
> 02
> 06
> Как написать запрос, чтобы в результате было '010206'?
> Спасибо.
Я получил несколько ответов. Спасибо Всем за соучастие.
Однако то ли я некорректно изъяснил суть проблемы, то ли меня не поняли,
но мне нужно было решить не частную эту проблему, а как говорят у нас на
Украине "взагалi", то есть мне нужна была функция, работающая в group by,
но умеющая конкатенировать поля varchar
Решение этой проблемы (как и многих других) лежит в чтении документации :)
Пару dml-стейтментов, и функция готова:
create or replace type OBJ_AGG_CONCAT as object
(
-- Author : Bill@cbsd.donetsk.ua
-- Created : 06.04.2005 16:03:18
-- Purpose : Routines for AGG_CONCAT
runningSum VARCHAR2(10000),
static function ODCIAggregateInitialize(value IN OUT OBJ_AGG_CONCAT)
return number,
member function ODCIAggregateIterate(self IN OUT OBJ_AGG_CONCAT,
value IN varchar2) return number,
member function ODCIAggregateTerminate(self IN OBJ_AGG_CONCAT,
returnValue
OUT varchar2, flags IN number) return number,
member function ODCIAggregateMerge(self IN OUT OBJ_AGG_CONCAT,
value IN OBJ_AGG_CONCAT) return number
);
/
create or replace type body OBJ_AGG_CONCAT is
static function ODCIAggregateInitialize(value IN OUT OBJ_AGG_CONCAT)
return number is
begin
value := OBJ_AGG_CONCAT('');
return ODCIConst.Success;
end;
member function ODCIAggregateIterate(self IN OUT OBJ_AGG_CONCAT, value IN
varchar2)
return number is
begin
runningSum := runningSum || value;
return ODCIConst.Success;
end;
member function ODCIAggregateTerminate(self IN OBJ_AGG_CONCAT, returnValue
OUT
varchar2, flags IN number) return number is
begin
returnValue := runningSum;
return ODCIConst.Success;
end;
member function ODCIAggregateMerge(self IN OUT OBJ_AGG_CONCAT, value IN
OBJ_AGG_CONCAT) return number is
begin
self.runningSum := self.runningSum || value.runningSum;
return ODCIConst.Success;
end;
end;
/
CREATE OR REPLACE FUNCTION AGG_CONCAT (input varchar2) RETURN varchar2
PARALLEL_ENABLE AGGREGATE USING OBJ_AGG_CONCAT;
/
И теперь я просто пишу
select agg_concat(my_field) from my_table
и получаю свои '010206' или же вдругом порядке, что сути не меняет
С ув. Роман
--- ifmail v.2.15dev5.3
* Origin: CBSD (2:5020/400)
SEEN-BY: 50/203 520 450/159 186 451/30 452/25 454/9 461/33 43 74 106 640
SEEN-BY: 464/34 465/204 469/125 999 550/5068 4623/56 4625/8 9 4626/100 4627/10
SEEN-BY: 4641/444 4646/1 4653/10 4657/50 5000/76 5001/5001 5002/76 5002
SEEN-BY: 5003/34 57 5004/58 5006/1 5007/1 5010/53 70 5011/13 5015/4 28 5020/20
SEEN-BY: 5020/52 104 115 118 128 150 175 194 400 401 545 600 639 642 715 758
SEEN-BY: 5020/794 894 921 968 982 1057 1100 1169 1212 1234 1356 1604 1626 1642
SEEN-BY: 5020/1835 1873 1909 1930 2013 2020 2200 2238 4400 4441 5021/3 44
SEEN-BY: 5022/128 5023/11 5025/19 151 750 5026/14 45 78 5030/69 195 382 920
SEEN-BY: 5030/966 1016 1063 1339 1900 5032/11 16 5033/21 35 5034/8 5035/10
SEEN-BY: 5036/1 13 5037/21 5040/33 47 5041/4 10 5042/13 5045/7 42 5049/157
SEEN-BY: 5050/9 41 5051/15 35 5053/16 5054/1 8 9 28 35 37 45 50 5056/16 5057/1
SEEN-BY: 5058/77 5059/20 5060/88 90 5061/15 5062/1 5063/5 41 51 5064/7 35 36
SEEN-BY: 5066/18 5070/26 66 1222 5071/22 5079/23 49 5080/80 1003 5081/2 5082/6
SEEN-BY: 5083/13 21 5090/23 5093/27 57 5100/113 6000/12 6001/3
PATH: 5020/400 4441 52 5054/1 37