sql >> Base de Datos >  >> RDS >> Oracle

Conexión de cadena agregada en Oracle 10g

Oracle 11g tiene esta función ordenada LISTAGG que es más o menos lo que desea, sin embargo, dado que está en 10g, no está disponible para usted (a menos que decida actualizar).

Si por algún motivo no desea (o no puede debido a cualquier motivo) actualizar a 11g, le sugiero que busque algunas alternativas a LISTAGG que están disponibles para usted en 10g.

Puede consultar algunas de las alternativas propuestas aquí

Ajustó rápidamente una adaptación rápida de una de las alternativas propuestas para que coincida con el escenario de su caso:

WITH Q AS
(
    SELECT 'North' POD, 'Rony' NAME FROM DUAL  UNION ALL
    SELECT 'North',     'James'     FROM DUAL  UNION ALL
    SELECT 'North',     'Aby'       FROM DUAL  UNION ALL
    SELECT 'South',     'Sam'       FROM DUAL  UNION ALL  
    SELECT 'South',     'Willy'     FROM DUAL  UNION ALL
    SELECT 'West',      'Mike'      FROM DUAL
)
SELECT   POD,
         RTRIM(
            XMLAGG (XMLELEMENT(e, name||',') ORDER BY name).EXTRACT('//text()'),
            ','
         ) AS name
    FROM q
GROUP BY POD;

Pero recuerde que esta no es la solución real, ya que tendrá que adaptarla a su tabla (no a la tabla DUAL ficticia), etc...

Su solución probablemente será algo así como:

SELECT   POD,
         RTRIM(
            XMLAGG (XMLELEMENT(E, NAME||',') ORDER BY NAME).EXTRACT('//text()'),
            ','
         ) AS NAME
    FROM tbl1
GROUP BY POD;

Si desea cambiar el delimitador, puede cambiarlo de coma en esta parte:

(E, NAME||',')

El RTRIM está ahí solo para cortar la coma final del final de la cadena concatenada, si no le molesta la coma final, puede omitir la función RTRIM para conservar la legibilidad.