powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / obiedenenie polei v select-e
5 сообщений из 5, страница 1 из 1
obiedenenie polei v select-e
    #32187229
Alex_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pomogite s zaprosom.
Est' tablitsa vida
F1 F2 F3
'aaaa' '1' 1
'aaaa' '2' 5
'bbbb' '7' 7
'bbbb' '9' 2

nujno poluchit result v vide
'aaaa' '1,2' 6
'bbbb' '7,9' 9

Mojet kto-nibud' uje delal tak?
Spasibo.
...
Рейтинг: 0 / 0
obiedenenie polei v select-e
    #32187245
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Третье поле, я так понимаю, это обыкновенный SUM(). А для конкатенации значений встроеной агрегатной функции не предусмотрено. Но в Oracle 9i появилась возможность написания собственной, сие называется "Агрегирующие Функции Определяемые Пользователем", или "User-Defined Aggregate Functions", UDAF'ы:

Oracle9i Data Cartridge Developer's Guide
User-Defined Aggregate Functions
http://technet.oracle.com/docs/products/oracle9i/doc_library/release2/appdev.920/a96595/dci11agg.htm#1004572

Применение их показывал Владимир Бегун в статье “Простые дроби”, “В коробке с карандашами...” или Агрегирующие Функции Определяемые Пользователем.
...
Рейтинг: 0 / 0
obiedenenie polei v select-e
    #32187249
Фотография Oleg Afanasiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще ты как-то не ясно говоришь, что тебе нужно :-(
Мне кажется тебе нужна агрегатная функция.
Пойди на фидошную конференцию ru.rdbms.oracle
там что-то подобное обсуждалось
У меня есть только решение проблемы
-------------------------------------------------------------------------------
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
From: Vladimir Begun <Vladimir.Begun@oracle.com>;
To: Eugenie M . <fido7.ru.rdbms.oracle@talk.ru>;
Date: Wednesday, December 04, 2002, 8:13:07 PM
Subject: SELECT, БНГБПЮЫЮЧЫХИ Я РПНЙС, ЯНДЕПФЮЫСЧ ПЕ Г СКЭРЮР ЯКНФЕМХЪ ЯХБ ЛН КЭМШУ ЯРПНЙ Б РЮАК ХЖЕ - fido7.ru.rdbms.oracle
Files: <none>
--====----====----====----====----====----====----====----====----====----===--
"Eugenie M." wrote:
> Одно непонятно - в конце статьи говорится о решении задачи с карандашами,
> условие задачи видно (и это именно то, что изначально интересовало меня), а
> решения не приведено. Или имеется в виду решение с CAST MULTISET?

Нет имеется в виду другое. Почему на сайте нет части статьи я не знаю.
Это код для 9i без комментариев.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
CREATE OR REPLACE TYPE strsum_t AS OBJECT (

  ls_sum                           VARCHAR2( 32767 )

, MEMBER FUNCTION get_separator
  RETURN VARCHAR2

, STATIC FUNCTION ODCIAggregateInitialize (
    ctx                            IN OUT strsum_t
  )
  RETURN NUMBER

, MEMBER FUNCTION ODCIAggregateIterate (
    self                           IN OUT strsum_t
  , value                          IN VARCHAR2
  )
  RETURN NUMBER

, MEMBER FUNCTION ODCIAggregateMerge (
    self                           IN OUT strsum_t
  , ctx                            IN strsum_t
  )
  RETURN NUMBER

, MEMBER FUNCTION ODCIAggregateTerminate (
    self                           IN strsum_t
  , value                          OUT VARCHAR2
  , flags                          IN NUMBER
  )
  RETURN NUMBER

);
/

CREATE OR REPLACE TYPE BODY strsum_t
AS

  MEMBER FUNCTION get_separator
  RETURN VARCHAR2
  IS
    ls_separator                   CONSTANT CHAR( 1 ) := ',';
  BEGIN
    RETURN ls_separator;
  END get_separator;

  STATIC FUNCTION ODCIAggregateInitialize (
    ctx                            IN OUT strsum_t
  )
  RETURN NUMBER
  IS
  BEGIN
    ctx := strsum_t(NULL);
    RETURN ODCIConst.Success;
  END ODCIAggregateInitialize;

  MEMBER FUNCTION ODCIAggregateIterate (
    self                           IN OUT strsum_t
  , value                          IN VARCHAR2
  )
  RETURN NUMBER
  IS
  BEGIN
    self.ls_sum := self.ls_sum || self.get_separator || value;
    RETURN ODCIConst.Success;
  END ODCIAggregateIterate;

  MEMBER FUNCTION ODCIAggregateMerge (
    self                           IN OUT strsum_t
  , ctx                            IN strsum_t
  )
  RETURN NUMBER
  IS
  BEGIN
    self.ls_sum := LTRIM(self.ls_sum, self.get_separator)
                || self.get_separator
                || LTRIM(ctx.ls_sum, self.get_separator)
    ;
    RETURN ODCIConst.Success;
  END ODCIAggregateMerge;

  MEMBER FUNCTION ODCIAggregateTerminate (
    self                           IN strsum_t
  , value                          OUT VARCHAR2
  , flags                          IN NUMBER
  )
  RETURN NUMBER
  IS
  BEGIN
    value := LTRIM(self.ls_sum, self.get_separator);
    RETURN ODCIConst.Success;
  END ODCIAggregateTerminate;

END;
/

CREATE OR REPLACE FUNCTION strsum (
  as_str_i                        VARCHAR2
)
RETURN VARCHAR2
PARALLEL_ENABLE
AGGREGATE USING
strsum_t;
/
COLUMN pencil_colors FORMAT A30
SELECT box_number
     , STRSUM(pencil_color) pencil_colors
  FROM pencil_box
 GROUP BY
       box_number
/
BOX_NUMBER PENCIL_COLORS
 ---------- ------------------------------
 
          1  Green,Yellow,Blue
          2  Red,Orange,Cyan
          3  Pink,Tan
          4  Black,Turquoise,White,Gray
 -- 
 



Vladimir Begun
The statements and opinions expressed here are my own and
do not necessarily represent those of Oracle Corporation.


Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru

Адрес этого сообщения в WWW: http://talk.mail.ru/article-23280262.html

------------------------------------------------------------------------------
...
Рейтинг: 0 / 0
obiedenenie polei v select-e
    #32187270
Alex_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Spasibo .
Deistvitel'no intersnaia statia,
no k sojaleniu rabotau s 8.1.7.
Budu iskat' dal'she. Esli kto-nibud' chto-nimud' znaet budu ochen' priznatelen za informaciu
...
Рейтинг: 0 / 0
obiedenenie polei v select-e
    #32187293
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UDAF дает возможность применять ее где угодно, для любой строки любой таблицы. Дополнительно ИМХО (надо проверить) предоставляются все возможности работы с аналитическими функциями типа OVER(). Для решения же конкретизированной задачи - соединить значения определенного поля определенной таблицы - можно написать и свою заглушку:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
create table test (
    test_id number( 9 )
  , code varchar2( 8  char)
  , value number( 9 )
)
/

exec dbms_random.seed(sysdate)
/
insert into test (test_id, code, value)
select rownum
    , chr( 97  + trunc(dbms_random.value *  25 ))
    , trunc(dbms_random.value *  10 )
from all_objects
where rownum <=  50 
/

create or replace function concat_test_id (
  p_code varchar2
) return varchar2 as
  v_result varchar2( 2000  char);
begin
  for i in (
    select rownum rw, test_id from test where code = p_code
  ) loop
    if i.rw !=  1  then
      v_result := v_result||',';
    end if;
    v_result := v_result||i.test_id;
  end loop;
  return v_result;
end;
/

select code
     , concat_test_id(code) concat_id
     , sum(value) sum_value
from test
group by code
/

...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / obiedenenie polei v select-e
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]