Domanda

A questa domanda ha già una risposta qui:

Come posso ottenere il seguente oracle senza creazione di una stored procedure?

Set Di Dati:

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

Risultato Desiderato:

question_id    element_id
1              7,8
2              9
3              10,11,12
È stato utile?

Soluzione

Ci sono molti modo per fare la stringa di aggregazione, ma il più semplice è una funzione definita dall'utente. Prova questo per un modo che non richiede una funzione. Come una nota, non vi è alcun modo semplice, senza la funzione.

Questo è il percorso più breve, senza una funzione personalizzata:(usa la funzione ROW_NUMBER() e SYS_CONNECT_BY_PATH funzioni )

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;

Altri suggerimenti

Da Oracle 11gR2, il LISTAGG clausola dovrebbe fare il trucco:

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

Attenzione se la stringa risultante è troppo grande (più di 4000 caratteri per un VARCHAR2, per esempio):dalla versione 12cR2, siamo in grado di utilizzare IN CASO DI OVERFLOW TRONCARE/ERRORE per affrontare questo problema.

Facile:

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

Pesonally testato su 10g ;-)

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

Questo OTN-thread contiene diversi modi per farlo stringa di aggregazione, tra cui un confronto di prestazioni: http://forums.oracle.com/forums/message.jspa?messageID=1819487#1819487

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top