Joomla 3.1 Templates by FatCow Coupon

Превращаем столбцы в строчки LISTAGG

Категория: Блог Опубликовано 24.05.2017

-- Превращаем столбцы в строчки
-- функция LISTAGG
-
Описание функции listagg
согласно переводу Oracle Reference Database listagg может использоваться
1) Как одиночная агрегатная функция, LISTAGG обрабатывает все строки и возвращает одно значение.
2) Как групповая агрегатная функция, LISTAGG обрабатывает и возвращает данные для каждой группы определенной в GROUP BY.
3) Как аналитическая функция, LISTAGG обрабатывает данные разбитые на блоки, задаваемые одним или несколькими выражениями query_partition_clause.
давайте рассмотрим самый интересный пример:


создадим таблицу следующего вида
имя клиента , номер телефона клиента

по ТЗ у каждого клиента может быть несколько телефонных номеров

подготовим тестовые данные

create table cl_phones(tname varchar2(100), phone varchar2(30));
insert into cl_phones(tname,phone) values ('Андрей','867-843-25');
insert into cl_phones(tname,phone) values ('Андрей','830-044-35');
insert into cl_phones(tname,phone) values ('Андрей','530-055-35');
insert into cl_phones(tname,phone) values ('Максим','530-055-35');
insert into cl_phones(tname,phone) values ('Максим','555-011-35');
insert into cl_phones(tname,phone) values ('Ваня','530-055-31');
insert into cl_phones(tname,phone) values ('Ваня','531-051-32');
insert into cl_phones(tname,phone) values ('Ваня','532-052-33');
insert into cl_phones(tname,phone) values ('Ваня','533-053-35');



-- давайте напишем запрос который бы выводил имя , телефоны в строку с разделителем

SELECT
   tname,
   LISTAGG(phone, ' ; ') WITHIN GROUP (ORDER BY phone) phonestr
FROM cl_phones
GROUP BY tname



результат 
tname phonestr 
Андрей 530-055-35 ; 830-044-35 ; 867-843-25
Ваня 530-055-31 ; 531-051-32 ; 532-052-33 ; 533-053-35
Максим 530-055-35 ; 555-011-35


необходимо отметить что функция LISTAGG появилась только в версии 11.2

Просмотров: 396