Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Групповые функции со строками, возможно?  [new]
Valdemar
Member

Откуда:
Сообщений: 1572
задача такая, есть курсор, типа такого

select d,f,g,r
from table

необходимо сделать группировку по первым стрем столбца, но так чтобы последний столбец не суммировался (как число), а склеивался с предыдущем. То есть как бы функция суммирования срок.?
20 ноя 06, 13:45    [3424218]     Ответить | Цитировать Сообщить модератору
 Re: Групповые функции со строками, возможно?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
Ищите по форуму - есть как примеры от Владимира Бегуна, так и ссылки на STRAGG
20 ноя 06, 13:48    [3424239]     Ответить | Цитировать Сообщить модератору
 Re: Групповые функции со строками, возможно?  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116175
Смотрите функцию SYS_CONNECT_BY_PATH
20 ноя 06, 13:48    [3424246]     Ответить | Цитировать Сообщить модератору
 Re: Групповые функции со строками, возможно?  [new]
vyv3
Member

Откуда: Нск
Сообщений: 305
CREATE OR REPLACE TYPE ARG_CONCAT AS OBJECT
(
  CONCAT_VALUE VARCHAR2(32767),

  STATIC FUNCTION ODCIAGGREGATEINITIALIZE(ACTX IN OUT ARG_CONCAT)
    RETURN NUMBER,

  MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT ARG_CONCAT,
                                       VAL  IN VARCHAR2) RETURN NUMBER,

  MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF        IN OUT ARG_CONCAT,
                                         RETURNVALUE OUT VARCHAR2,
                                         FLAGS       IN NUMBER)
    RETURN NUMBER,

  MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT ARG_CONCAT,
                                     CTX2 IN ARG_CONCAT) RETURN NUMBER

)
/

CREATE OR REPLACE TYPE BODY ARG_CONCAT IS

  STATIC FUNCTION ODCIAGGREGATEINITIALIZE(ACTX IN OUT ARG_CONCAT)
    RETURN NUMBER IS
  BEGIN
    IF ACTX IS NULL
    THEN
      ACTX := ARG_CONCAT('');
    ELSE
      ACTX.CONCAT_VALUE := '';
    END IF;
  
    RETURN ODCICONST.SUCCESS;
  END;

  MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT ARG_CONCAT,
                                       VAL  IN VARCHAR2) RETURN NUMBER IS
  BEGIN
    SELF.CONCAT_VALUE := SELF.CONCAT_VALUE || ',' ||VAL;
    RETURN ODCICONST.SUCCESS;
  END;

  MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF        IN OUT ARG_CONCAT,
                                         RETURNVALUE OUT VARCHAR2,
                                         FLAGS       IN NUMBER) RETURN NUMBER IS
  BEGIN
    RETURNVALUE := TRIM(LEADING ',' FROM SELF.CONCAT_VALUE);
    RETURN ODCICONST.SUCCESS;
  END;

  MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT ARG_CONCAT,
                                     CTX2 IN ARG_CONCAT) RETURN NUMBER IS
  BEGIN
    SELF.CONCAT_VALUE := SELF.CONCAT_VALUE || CTX2.CONCAT_VALUE;
    RETURN ODCICONST.SUCCESS;
  END;

END;
/


CREATE OR REPLACE FUNCTION CONCAT_COL(X VARCHAR2) RETURN VARCHAR2
  PARALLEL_ENABLE
  AGGREGATE USING ARG_CONCAT;
/

SQL> WITH TAB1 AS (
  2  SELECT 1 rn, '1aaaa' st  FROM DUAL union all
  3  SELECT 1 , '1bbb'  st  FROM DUAL union all
  4  SELECT 2, '2bbb'  st  FROM DUAL union all
  5  SELECT 2, '2ccc'  st  FROM DUAL union all
  6  SELECT 2, '2dddd' st  FROM DUAL 
  7  )
  8  SELECT rn,CONCAT_COL(st) FROM TAB1
  9  group by rn;

        RN CONCAT_COL(ST)
---------- ---------------------------------------------
         1 1aaaa,1bbb
         2 2bbb,2dddd,2ccc

SQL> 
SQL> 
20 ноя 06, 13:51    [3424270]     Ответить | Цитировать Сообщить модератору
 Re: Групповые функции со строками, возможно?  [new]
Elic
Member

Откуда:
Сообщений: 29980
RTFM ТОП: SQL, PL/SQL: 5) Как получить все значения одного поля в одной строке, через разделители?
20 ноя 06, 14:01    [3424338]     Ответить | Цитировать Сообщить модератору
 Re: Групповые функции со строками, возможно?  [new]
Valdemar
Member

Откуда:
Сообщений: 1572
понятно, готовых решений нет, надо писать свое. Спасибо
20 ноя 06, 14:27    [3424495]     Ответить | Цитировать Сообщить модератору
 Re: Групповые функции со строками, возможно?  [new]
pan159
Member

Откуда: Москва
Сообщений: 814
Почему нет?
В FAQ есть пример с использованием SYS_CONNECT_BY_PATH. Как раз ваша задача. Отлично работает .
20 ноя 06, 18:26    [3426336]     Ответить | Цитировать Сообщить модератору
 Re: Групповые функции со строками, возможно?  [new]
pan159
Member

Откуда: Москва
Сообщений: 814
--Вот и работающий пример.
select
ID_INVOICE,
event_date, subject, customer_name, liftec_ref, event, event_number,
max("IDs") as machine_description
from
( select event_date, subject, customer_name, liftec_ref, event, event_number, ID_INVOICE, ltrim(sys_connect_by_path(machine_description, ', '), ', ') as "IDs"
from
( select event_date, subject, customer_name, liftec_ref, event, event_number, ID_INVOICE, id, v.machine_description,
lag(id) over (partition by event_date, subject, customer_name, liftec_ref, event, event_number, ID_INVOICE, ID_INVOICE order by id) as prev_id
from even_v v
)
start with prev_id is null
connect by prev_id = prior id and ID_INVOICE = prior ID_INVOICE
)
group by event_date, subject, customer_name, liftec_ref, event, event_number, ID_INVOICE
20 ноя 06, 18:29    [3426344]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить