2008-10-24 12 views
8

Ich habe Daten unter Verwendung von GROUP, die wieSQL - Mehrere Werte durch Komma getrennt, wenn BY

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 
sieht

Ich mag würde eine Abfrage schreiben, die die Daten wie folgt aussehen würde:

CUSTOMER, CUSTOMER_ID, PRODUCTS 
ABC INC 1   XYX, ZZZ 
DEF CO 2   XYX, ZZZ, WWW 
GHI LLC 3   ZYX 

Mit 10g Oracle wenn hilft. Ich habe etwas gesehen, das mit MYSQL funktioniert, aber ich brauche ein einfaches SQL- oder ORACLE-Äquivalent. Ich habe auch Beispiele für gespeicherte Procs gesehen, die erstellt werden können. Ich kann jedoch keinen gespeicherten Proc mit dem Produkt verwenden, das ich verwende.

Hier wie ist es in MySQL arbeiten, wenn ich es verwendet haben

SELECT CUSTOMER, 
     CUSTOMER_ID, 
     GROUP_CONCAT(PRODUCT) 
FROM MAGIC_TABLE 
GROUP BY CUSTOMER, CUSTOMER_ID 

Danke.

+0

Wie Sie das Gleiche in SQL Server –

Antwort

4

This link bezieht sich auf eine Reihe von Beispielen für verschiedene Möglichkeiten, dies auf Oracle zu tun. Sehen Sie, ob dort etwas vorhanden ist, für das Sie Berechtigungen in Ihrer Datenbank haben.

+0

-1 tun, weil diese Antwort nutzlos ist auf eigene. Bitte überlegen Sie, Ihre Antwort zu verbessern, indem Sie den Inhalt des Links zusammenfassen, falls der Link in Zukunft ungültig wird. – axiopisty

0

Dank Nigel,

My SQL nicht so elegant ist wie sein könnte, aber ich brauchte eine Lösung, die SQL nur erforderlich, nicht PLSQL oder TSQL, so dass es am Ende so aussieht:

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 

Noch nicht genau sicher, was die XML-Funktionen genau tun, aber ich werde graben, wenn der Bedarf entsteht.

10

Ich denke LISTAGG ist die beste Gesamtgruppe durch die Funktion in dieser Situation zu verwenden:

SELECT CUSTOMER, CUSTOMER_ID, 
     LISTAGG(PRODUCT, ', ') WITHIN GROUP (ORDER BY PRODUCT) 
    FROM SOME_TABLE 
GROUP BY CUSTOMER, CUSTOMER_ID 
ORDER BY 1, 2 
+2

LISTAGG ist nicht in 10g erhältlich. –

+0

Dies ist eine großartige Art und Weise zu bekommen genau das, was ich –

+0

'code'SELECT Bereichsname, LISTAGG (DISPLAY_NAME, '') innerhalb der Gruppe (ORDER BY Bereichsname) VON (SELECT s.SPACENAME, u.username, cu wollte .DISPLAY_NAME aus Räumen s JOIN SPACEPERMISSIONS p oN s.SPACEID p.SPACEID = JOIN u oN p.PERMUSERNAME user_mapping = u.user_key CWD_USER Cu auf u.username = cu.LOWER_USER_NAME WHERE p.PERMTYPE verbinden = 'SETSPACEPERMISSIONS' UND am SPACENAME NICHT WIE '% (%' ) GROUP BY SPACENAME ORDER BY SPACENAME; 'Code' – anthos

3

Die Oracle-Benutzer Funktion ‚wm_concat‘ funktioniert auf die gleiche Art und Weise wie LISTAGG außer Sie kein Trennzeichen angeben können ‚‘ durch Standard oder eine Sortierreihenfolge. Es ist jedoch kompatibel mit 10g.