Ci sono molti modi per fare l'aggregazione stringa, ma il più semplice è una funzione definita dall'utente. Try this for a way that does not require a function. Come nota, non esiste un modo semplice senza la funzione.
Questo è il percorso più breve, senza una funzione personalizzata: (usa il ROW_NUMBER() e le funzioni 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;
funziona benissimo! ROW_NUMBER() è quello che mi mancava per far funzionare sys_connect_by_path per me. –
Si noti che quando questa tecnica viene applicata per concatenare un campo il cui valore può contenere il separatore, viene generato il seguente errore: 'ORA-30004: quando si utilizza la funzione SYS_CONNECT_BY_PATH, non può avere separatore come parte del valore della colonna. ... E se il valore concatenato supera la lunghezza massima di 4000 byte, si otterrebbe l'errore: 'ORA-01489: il risultato della concatenazione di stringhe è troppo lungo. – Somu