Saltar a contenido

El ROLLUP de PostgreSQL es una subcláusula de la cláusula GROUP BY que ofrece una forma abreviada de definir múltiples conjuntos de agrupación. Un conjunto de agrupación es un conjunto de columnas por las que se agrupa. Consulte el tutorial sobre conjuntos de agrupación para obtener información detallada.

A diferencia de la subcláusula CUBE, ROLLUP no genera todos los posibles conjuntos de agrupación basados en las columnas especificadas. Sólo genera un subconjunto de ellos.

El ROLLUP asume una jerarquía entre las columnas de entrada y genera todos los conjuntos de agrupación que tienen sentido teniendo en cuenta la jerarquía. Esta es la razón por la que el ROLLUP se utiliza a menudo para generar los subtotales y el total general de los informes.

Por ejemplo, el CUBO (c1,c2,c3) genera los ocho conjuntos de agrupación posibles:

(c1, c2, c3)
(c1, c2)
(c2, c3)
(c1,c3)
(c1)
(c2)
(c3)
()

Sin embargo, el ROLLUP(c1,c2,c3) genera sólo cuatro conjuntos de agrupación, asumiendo la jerarquía c1 > c2 > c3 como sigue:

(c1, c2, c3)
(c1, c2)
(c1)
()

Un uso común de ROLLUP es calcular las agregaciones de datos por año, mes y fecha, considerando la jerarquía year > month > date.

A continuación se ilustra la sintaxis del ROLLUP de PostgreSQL:

SELECT
    c1,
    c2,
    c3,
    aggregate(c4)
FROM
    table_name
GROUP BY
    ROLLUP (c1, c2, c3);

También es posible hacer un roll up parcial para reducir el número de subtotales generados.

SELECT
    c1,
    c2,
    c3,
    aggregate(c4)
FROM
    table_name
GROUP BY
    c1, 
    ROLLUP (c2, c3);

ROLLUP ejemplos

Si no ha creado la tabla de ventas, puede utilizar el siguiente script:

DROP TABLE IF EXISTS sales;
CREATE TABLE sales (
    brand VARCHAR NOT NULL,
    segment VARCHAR NOT NULL,
    quantity INT NOT NULL,
    PRIMARY KEY (brand, segment)
);

INSERT INTO sales (brand, segment, quantity)
VALUES
    ('ABC', 'Premium', 100),
    ('ABC', 'Basic', 200),
    ('XYZ', 'Premium', 100),
    ('XYZ', 'Basic', 300);
Code language: PHP (php)

La siguiente consulta utiliza la cláusula ROLLUP para encontrar el número de productos vendidos por marca (subtotal) y por todas las marcas y segmentos (total).

SELECT
    brand,
    segment,
    SUM (quantity)
FROM
    sales
GROUP BY
    ROLLUP (brand, segment)
ORDER BY
    brand,
    segment;

PostgreSQL ROLLUP example

Como se puede ver claramente en el resultado, la tercera fila muestra las ventas de la marca ABC, la sexta fila muestra las ventas de la marca XYZ. La última fila muestra el total general de todas las marcas y segmentos. En este ejemplo, la jerarquía es "marca > segmento".

Si cambia el orden de la marca y el segmento, el resultado será diferente, como se indica a continuación:

SELECT
    segment,
    brand,
    SUM (quantity)
FROM
    sales
GROUP BY
    ROLLUP (segment, brand)
ORDER BY
    segment,
    brand;

PostgreSQL ROLLUP example 2

En este caso, la jerarquía es segmento > marca.

La siguiente sentencia realiza un roll-up parcial:

SELECT
    segment,
    brand,
    SUM (quantity)
FROM
    sales
GROUP BY
    segment,
    ROLLUP (brand)
ORDER BY
    segment,
    brand;

PostgreSQL ROLLUP - partial roll up

Consulte la siguiente tabla rental de la base de datos de ejemplo.

Rental Table

La siguiente sentencia encuentra el número de alquileres por día, mes y año utilizando el ROLLUP:

SELECT
    EXTRACT (YEAR FROM rental_date) y,
    EXTRACT (MONTH FROM rental_date) M,
    EXTRACT (DAY FROM rental_date) d,
    COUNT (rental_id)
FROM
    rental
GROUP BY
    ROLLUP (
        EXTRACT (YEAR FROM rental_date),
        EXTRACT (MONTH FROM rental_date),
        EXTRACT (DAY FROM rental_date)
    );

PostgreSQL ROLLUP example with year month and date

En este tutorial, ha aprendido a utilizar el ROLLUP de PostgreSQL para generar múltiples conjuntos de agrupación.