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

Función LISTAGG() en Oracle

En Oracle, el LISTAGG() La función nos permite combinar datos de varias filas en una sola fila.

Tenemos la opción de especificar un separador (como una coma). También podemos ordenar los resultados producidos por LISTAGG() funciones y más.

Sintaxis

La sintaxis es así:

LISTAGG( [ ALL | DISTINCT ] measure_expr [, 'delimiter'] [listagg_overflow_clause] )
  [ WITHIN GROUP order_by_clause ] [OVER query_partition_clause]

Donde listagg_overflow_clause es:

{ ON OVERFLOW ERROR }
|
{ ON OVERFLOW TRUNCATE [ 'truncation-indicator' ] [ { WITH | WITHOUT } COUNT ] }

Ejemplo

Supongamos que ejecutamos la siguiente consulta:

SELECT region_name
FROM regions;

Resultado:

              REGION_NAME 
_________________________ 
Europe                    
Americas                  
Asia                      
Middle East and Africa    

Podemos usar LISTAGG() para convertir esos resultados en una lista separada por comas:

SELECT LISTAGG(region_name, ', ')
FROM regions;

Resultado:

                         LISTAGG(REGION_NAME,',') 
_________________________________________________ 
Europe, Americas, Asia, Middle East and Africa    

Cambiar el Separador

Podemos cambiar el segundo argumento a un separador diferente:

SELECT LISTAGG(region_name, '; ') 
FROM regions;

Resultado:

Europe; Americas; Asia; Middle East and Africa 

Omitir el separador

Podemos omitir el segundo argumento para tener cada valor concatenado sin un separador:

SELECT LISTAGG(region_name) 
FROM regions;

Resultado:

EuropeAmericasAsiaMiddle East and Africa

Ordenar los resultados

Podemos usar el WITHIN GROUP (ORDER BY...) cláusula para ordenar la salida de LISTAGG() función:

SELECT LISTAGG(region_name, ',') WITHIN GROUP (ORDER BY region_name ASC) 
FROM regions;

Resultado:

Americas,Asia,Europe,Middle East and Africa

Uso en consultas agrupadas

Podemos usar el LISTAGG() función dentro de una consulta agrupada para proporcionar resultados como este:

SELECT 
    region_id,
    LISTAGG(country_id, ', ') WITHIN GROUP (ORDER BY country_id ASC) AS "Countries"
FROM countries
GROUP BY region_id
ORDER BY region_id;

Resultado:

   REGION_ID                         Countries 
____________ _________________________________ 
           1 BE, CH, DE, DK, FR, IT, NL, UK    
           2 AR, BR, CA, MX, US                
           3 AU, CN, HK, IN, JP, SG            
           4 EG, IL, KW, NG, ZM, ZW           

Devolver solo valores distintos

Podemos usar el DISTINCT cláusula para devolver solo valores únicos:

SELECT LISTAGG(DISTINCT region_id, ', ') 
FROM regions;

Resultado:

1, 2, 3, 4

Consulte la documentación de Oracle para obtener más detalles sobre lo que puede hacer con esta función.