2008-10-24 20 views
8

que tienen los datos que se parece aSQL - Múltiples valores separados por comas cuando se utiliza GROUP 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 

me gustaría escribir una consulta que haría que los datos de este aspecto:

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

El uso de Oracle 10g si ayuda. Vi algo que funcionaría usando MYSQL, pero necesito un SQL simple o un equivalente de ORACLE. También he visto ejemplos de procs almacenados que podrían hacerse, sin embargo, no puedo usar un proceso almacenado con el producto que estoy usando.

Aquí es ¿cómo funciona en MySQL si estaban usando

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

Gracias.

+0

Cómo hacer lo mismo en SQL Server –

Respuesta

4

This link se refiere a una serie de ejemplos de diferentes formas de hacer esto en Oracle. Vea si hay algo allí que tenga permisos en su base de datos para hacer.

+0

-1 porque esta respuesta es inútil por sí misma. Considere mejorar su respuesta al resumir el contenido en el enlace en caso de que el enlace se vuelva inválido en el futuro. – axiopisty

0

Gracias Nigel,

My SQL no es tan elegante como podría ser, pero necesitaba una solución que requiere SQL solamente, no plsql o TSQL, así que terminó con este aspecto:

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 

Todavía no estoy exactamente seguro de lo que hacen exactamente las funciones XML, pero voy a indagar cuando sea necesario.

10

creo LISTAGG es el mejor grupo agregada por la función a utilizar en esta situación:

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 no está disponible en 10g. –

+0

Esta es una gran manera de conseguir exactamente lo que quería –

+0

'code'SELECT SPACENAME, LISTAGG (DISPLAY_NAME, '') dentro del grupo (ORDER BY SPACENAME) DE (seleccione s.SPACENAME, u.username, cu .DISPLAY_NAME de los espacios s JOIN SPACEPERMISSIONS p = eN s.SPACEID p.SPACEID JOIN user_mapping u eN p.PERMUSERNAME = u.user_key unen a cu CWD_USER en u.username = cu.LOWER_USER_NAME DONDE p.PERMTYPE = 'SETSPACEPERMISSIONS' Y en SPANAME NO ME GUSTA '% (%' ) GROUP BY SPACENAME SOLICITAR POR SPACENAME; 'código' – anthos

3

El usuario de Oracle función 'wm_concat' funciona de la misma manera que LISTAGG excepto que no puede especificar un delimitador '' por predeterminado o un orden de clasificación. Sin embargo, es compatible con 10g.

Cuestiones relacionadas