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.