SQL: valori multipli separati da virgola quando si utilizza GROUP BY [duplicato]
Domanda
Questa domanda ha già una risposta qui:
Ho dei dati simili a
CUSTOMER, CUSTOMER_ID, PRODUCT ABC INC 1 XYX ABC INC 1 ZZZ DEF CO 2 XYX DEF CO 2 ZZZ DEF CO 2 WWW GHI LLC 3 ZYX
Vorrei scrivere una query per rendere i dati così:
CUSTOMER, CUSTOMER_ID, PRODUCTS ABC INC 1 XYX, ZZZ DEF CO 2 XYX, ZZZ, WWW GHI LLC 3 ZYX
Utilizzando Oracle 10g se aiuta. Ho visto qualcosa che avrebbe funzionato usando MYSQL, ma ho bisogno di un semplice equivalente SQL o ORACLE. Ho anche visto esempi di proc memorizzati che potrebbero essere fatti, tuttavia, non posso usare un proc memorizzato con il prodotto che sto usando.
Ecco come funzionerebbe in MySQL se lo stessi usando
SELECT CUSTOMER,
CUSTOMER_ID,
GROUP_CONCAT( PRODUCT )
FROM MAGIC_TABLE
GROUP BY CUSTOMER, CUSTOMER_ID
Grazie.
Soluzione
Questo link fa riferimento a una serie di esempi di modi diversi per fare questo su Oracle. Vedi se c'è qualcosa che hai i permessi sul tuo database da fare.
Altri suggerimenti
Penso che LISTAGG sia il miglior gruppo aggregato per funzione da utilizzare in questa situazione:
SELECT CUSTOMER, CUSTOMER_ID,
LISTAGG(PRODUCT, ', ') WITHIN GROUP (ORDER BY PRODUCT)
FROM SOME_TABLE
GROUP BY CUSTOMER, CUSTOMER_ID
ORDER BY 1, 2
La funzione utente dell'oracolo 'wm_concat' funziona allo stesso modo di LISTAGG tranne per il fatto che non è possibile specificare un delimitatore ',' per impostazione predefinita o un ordinamento. È tuttavia compatibile con 10g.
Grazie Nigel,
Il mio SQL non è elegante come potrebbe essere, ma avevo bisogno di una soluzione che richiedesse solo SQL, non PLSQL o TSQL, quindi alla fine sembrava così:
SELECT CUSTOMER, CUSTOMER_ID, COUNT(PRODUCT) PROD_COUNT,
RTRIM(
XMLAGG( XMLELEMENT (C, PRODUCT || ',') ORDER BY PRODUCT
).EXTRACT ('//text()'), ','
) AS PRODUCTS FROM (
SELECT DISTINCT CUSTOMER, CUSTOMER_ID, PRODUCT
FROM MAGIC_TABLE
) GROUP BY CUSTOMER, CUSTOMER_ID ORDER BY 1 , 2
Ancora non sono esattamente sicuro di cosa faccia esattamente la funzione XML, ma scavero quando arriverà la necessità.