sql - tipos - ¿Cómo se pueden concatenar varias filas en una en Oracle sin crear un procedimiento almacenado?
procedure oracle ejemplos (4)
Esta pregunta ya tiene una respuesta aquí:
¿Cómo puedo lograr lo siguiente en Oracle sin crear un procedimiento almacenado?
Conjunto de datos:
question_id element_id
1 7
1 8
2 9
3 10
3 11
3 12
Resultado deseado:
question_id element_id
1 7,8
2 9
3 10,11,12
De Oracle 11gR2, la cláusula LISTAGG debería hacer el truco:
SELECT question_id,
LISTAGG(element_id, '','') WITHIN GROUP (ORDER BY element_id)
FROM YOUR_TABLE
GROUP BY question_id;
Este subproceso OTN contiene varias formas de agregar cadenas, incluida una comparación de rendimiento: http://forums.oracle.com/forums/message.jspa?messageID=1819487#1819487
Fácil:
SELECT question_id, wm_concat(element_id) as elements
FROM questions
GROUP BY question_id;
Pesonally probado en 10g ;-)
De http://www.oracle-base.com/articles/10g/StringAggregationTechniques.php
Hay muchas maneras de hacer la agregación de cadenas, pero la más fácil es una función definida por el usuario. Pruebe esto de una manera que no requiera una función. Como nota, no hay una manera simple sin la función.
Esta es la ruta más corta sin una función personalizada: (usa las funciones ROW_NUMBER () y 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;