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;
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;
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;
Consulte la siguiente tabla rental
de la base de datos de ejemplo.
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)
);
En este tutorial, ha aprendido a utilizar el ROLLUP
de PostgreSQL para generar múltiples conjuntos de agrupación.