¿Cómo pueden ser concatenados múltiples filas en una en Oracle sin crear un procedimiento almacenado? [duplicar]
-
21-08-2019 - |
Pregunta
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
Solución
Hay muchas maneras de hacer la agregación de cuerdas, pero la más fácil es una función definida por el usuario. Prueba esto una manera que no requiere de una función. Como nota , no hay una forma sencilla y sin la función.
Esta es la ruta más corta y sin una función personalizada: (se utiliza el ROW_NUMBER () y funciones 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;
Otros consejos
A partir de Oracle 11gR2, el LISTAGG cláusula debe hacer el truco:
SELECT question_id,
LISTAGG(element_id, ',') WITHIN GROUP (ORDER BY element_id)
FROM YOUR_TABLE
GROUP BY question_id;
Tenga cuidado si la cadena resultante es demasiado grande (más de 4000 caracteres para un VARCHAR2, por ejemplo): desde la versión 12cR2, podemos usar en caso de desbordamiento TRUNCATE / ERROR para hacer frente a este problema.
Fácil:
SELECT question_id, wm_concat(element_id) as elements
FROM questions
GROUP BY question_id;
pesonally probado en 10 g; -)
http://www.oracle-base.com/articles/10g /StringAggregationTechniques.php
Esta OTN-hilo contiene varias maneras de hacer la agregación de cadena, incluyendo una comparación de rendimiento: http://forums.oracle.com/forums/message.jspa?messageID=1819487#1819487