Esta función permite concatenar varias filas separadas por algún carácter en Oracle (solo 11 o superior).
Por ejemplo, imaginemos que tenemos la tabla Facturas (perdón solo este tipo de ejemplos se me ocurren siempre), con lo siguiente:
Factura | Fecha | Nit |
---|---|---|
1 | 01/01/2001 | 111111 |
2 | 02/02/2002 | 222222 |
3 | 03/03/2003 | 333333 |
Y la tabla FacturasDetalle con lo siguiente:
Factura | Cantidad | Producto | Precio |
---|---|---|---|
1 | 3 | Lápiz | 1.00 |
1 | 3 | Borrador | 0.50 |
1 | 3 | Sacapuntas | 0.25 |
2 | 2 | Cuaderno | 2.50 |
2 | 2 | Regla | 1.75 |
3 | 1 | Lapicero | 2.00 |
Y que queremos mostrar los datos de la factura, con el total a pagar pero solo el nombre de los ítems separados por coma:
SELECT
FACTURA,
FECHA,
NIT,
SUM(CANTIDAD * PRECIO) TOTAL,
LISTAGG(PRODUCTO, ',') WITH GROUP (ORDER BY PRODUCTO) PRODUCTOS
FROM
FACTURAS
INNER JOIN FACTURASDETALLE USING (FACTURA);
Entonces el resultado del query sería algo como esto:
Factura | Fecha | Nit | Total | Productos |
---|---|---|---|---|
1 | 01/01/2001 | 111111 | 7.75 | Borrador, Lápiz Sacapuntas |
2 | 02/02/2002 | 222222 | 8.50 | Cuaderno, Regla |
3 | 03/03/2003 | 333333 | 2.00 | Lapicero |
Nota: no sé si las sumas están bien, pero la idea es esa. Jejeje
PD.: El JOIN también se puede hacer con esta sintaxis que creo que es la que más utilizan algunos oraclers, jejeje
SELECT
FACTURAS.FACTURA,
FECHA,
NIT,
SUM(CANTIDAD * PRECIO) TOTAL,
LISTAGG(PRODUCTO, ',') WITH GROUP (ORDER BY PRODUCTO) PRODUCTOS
FROM
FACTURAS,
FACTURASDETALLE
WHERE
FACTURAS.FACTURA = FACTURASDETALLE.FACTURA;
Saludos y hasta la próxima.