Hay muchas maneras de hacer la agregación de cuerdas, pero la más fácil es una función definida por el usuario. Try this for a way that does not require a function. Como nota, no hay una manera simple sin la función.
Ésta 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;
funciona muy bien! ROW_NUMBER() es lo que me faltaba para que sys_connect_by_path me funcionara. –
Tenga en cuenta que cuando se aplica esta técnica para concatenar un campo cuyo valor puede contener el separador, se produce el siguiente error: 'ORA-30004: cuando se utiliza la función SYS_CONNECT_BY_PATH, no puede tener separador como parte del valor de la columna' ... Y si el valor concatenado excede la longitud máxima de 4000 bytes, obtendría el error: 'ORA-01489: el resultado de la concatenación de cadenas es demasiado largo. – Somu