Как можно объединить несколько строк в одну в Oracle без создания хранимой процедуры?[дубликат]

StackOverflow https://stackoverflow.com/questions/1076011

Вопрос

На этот вопрос уже есть ответ здесь:

Как я могу достичь следующего в oracle без создания хранимой процедуры?

Набор данных:

question_id    element_id
1              7
1              8
2              9
3              10
3              11
3              12

Желаемый результат:

question_id    element_id
1              7,8
2              9
3              10,11,12
Это было полезно?

Решение

Существует много способов выполнить агрегацию строк, но самый простой - это определяемая пользователем функция. Попробуйте это для способа, который не требует наличия функции. В качестве примечания, простого способа без этой функции не существует.

Это самый короткий маршрут без пользовательской функции:(он использует функции ROW_NUMBER() и SYS_CONNECT_BY_PATH )

SELECT questionid,
       LTRIM(MAX(SYS_CONNECT_BY_PATH(elementid,','))
       KEEP (DENSE_RANK LAST ORDER BY curr),',') AS elements
FROM   (SELECT questionid,
               elementid,
               ROW_NUMBER() OVER (PARTITION BY questionid ORDER BY elementid) AS curr,
               ROW_NUMBER() OVER (PARTITION BY questionid ORDER BY elementid) -1 AS prev
        FROM   emp)
GROUP BY questionid
CONNECT BY prev = PRIOR curr AND questionid = PRIOR questionid
START WITH curr = 1;

Другие советы

Из Oracle 11gR2, the ЛИСТАГГ предложение должно сделать свое дело:

SELECT question_id,
       LISTAGG(element_id, ',') WITHIN GROUP (ORDER BY element_id)
FROM YOUR_TABLE
GROUP BY question_id;

Будьте осторожны, если результирующая строка слишком большая (например, более 4000 символов для VARCHAR2).:начиная с версии 12cR2, мы можем использовать ПРИ ПЕРЕПОЛНЕНИИ УСЕКАЕТСЯ / ОШИБКА чтобы разобраться с этой проблемой.

Легко:

SELECT question_id, wm_concat(element_id) as elements
FROM   questions
GROUP BY question_id;

Песенно протестировано на 10g ;-)

От http://www.oracle-base.com/articles/10g/StringAggregationTechniques.php

Этот OTN-поток содержит несколько способов агрегирования строк, включая сравнение производительности: http://forums.oracle.com/forums/message.jspa?messageID=1819487#1819487

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top