СУБД
Добавил(а) shixaro, последний раз редактировал(а) shixaro Sep 18, 2012  (посмотреть изменения)
Метки: 

В 10м оракле есть недокументированная функция wm_concat(). Она поддерживается и в 11м, но так как она недокументированная, то и полноценное ее использование может оказаться накладным - ее могут убрать в будущих выпусках и придется переписывать запросы с ее упоминанием.

Начиная с 11го оракла для агрегации в строку есть функция listagg().

К примеру, есть таблица test:

1	abc
1	cbd
1	dce
1	cef
2	xxx
2	yyy
2	zzz
3	aaa
3	bbb
3	ccc

Нужно сгруппировать выборку из таблицы в строку по одному из столбцов.
С помощью wm_concat() это будет выглядеть так:

SELECT a, WM_CONCAT(b) FROM test GROUP BY a;

На выходе:

1	abc,cbd,dce,cef
2	xxx,yyy,zzz
3	aaa,ccc,bbb

В 11м оракле все будет точно также. Но функция listagg() дает больше маневра. От выбора разделителя в строке до вариантов группировки (одиночная, групповая)

SELECT a, listagg(b, ', ') WITHIN GROUP (order by a) FROM test GROUP BY a
1	abc, cbd, cef, dce
2	xxx, yyy, zzz
3	aaa, bbb, ccc

Подробнее про listagg(): http://docs.oracle.com/cd/E14072_01/server.112/e10592/functions087.htm

Powered by Atlassian Confluence, the Enterprise Wiki. (Version: 2.5 Build:#805 Apr 26, 2007) - Запрос Bug/feature - Связаться с администраторами