2012-08-27 5 views
5

Ho due colonne in database OracleCome recuperare due dati di colonne in un formato B in Oracle

+---------+---------+ 
| Column1 | Column2 | 
+---------+---------+ 
| A  | 1  | 
| A  | 2  | 
+---------+---------+ 

voglio retireive i dati come mi metterò i dati come risultato

+---------+---------+ 
| Column1 | Column2 | 
+---------+---------+ 
| A  | 1,2  | 
+---------+---------+ 

Per favore forniscimi la soluzione.

+0

Ho modificato la tua domanda per vedere le linee in modalità codice, si può confermare che è quello che volevi dire ... Ops, bluefeet trumped mia edita. – boisvert

+0

possibile duplicato di [valori di colonna in una riga] (http://stackoverflow.com/questions/9482560/column-values-in-a-row) –

+0

possibile duplicato di [Creazione di un elenco di valori separati da virgola in un Oracle Istruzione SQL] (http://stackoverflow.com/questions/5822700/building-a-comma-separated-list-of-values-in-an-oracle-sql-statement) – DCookie

risposta

16

Tim Hall ha una bella lista canonica di string aggregation techniques in Oracle.

Quale tecnica si utilizza dipende da una serie di fattori tra cui la versione di Oracle e se si sta cercando una soluzione puramente SQL. Se si utilizza Oracle 11.2, probabilmente sarei suggerisco di usare LISTAGG

SELECT column1, listagg(column2, ',') WITHIN GROUP(order by column2) 
    FROM table_name 
GROUP BY column1 

Se si utilizza una versione precedente di Oracle, a patto che non ha bisogno di una soluzione puramente SQL, io in genere preferisco usare l'approccio user-defined aggregate function .

+0

Justin, questa query funzionerebbe se dovessimo raggruppare su più colonne per favore? Grazie. – Jimmy

+0

@Jimmy - Sì, dovrebbe. –

+0

Ulteriori dettagli su http://docs.oracle.com/cd/E11882_01/server.112/e10592/functions089.htm#SQLRF55593 –

1

Se avete 10g, allora si deve passare attraverso la seguente funzione:

CREATE OR REPLACE FUNCTION get_comma_separated_value (input_val in number) 
    RETURN VARCHAR2 
IS 
    return_text VARCHAR2(10000) := NULL; 
BEGIN 
    FOR x IN (SELECT col2 FROM table_name WHERE col1 = input_val) LOOP 
    return_text := return_text || ',' || x.col2 ; 
    END LOOP; 
    RETURN LTRIM(return_text, ','); 
END; 
/

Quindi, si può fare come:

select col1, get_comma_separated_value(col1) from table_name 

Fiddle here

Se avete ottenuto oracolo 11g, è possibile utilizzare listagg:

SELECT 
    col1, 
    LISTAGG(col2, ', ') WITHIN GROUP (ORDER BY col2) "names" 
FROM table_x 
GROUP BY col1 

Fiddle here for Listagg

per MySQL, la sua gonna essere semplice:

SELECT col1, GROUP_CONCAT(col2) FROM table_name GROUP BY col1 
Problemi correlati