0Pricing
SQL Academy · Lección

ROLLUP para subtotales

Subtotales acumulados y totales generales

ROLLUP para subtotales es una lección gratuita de SQL Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de SQL Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Academy incluye 4 lecciones en total.

¿Qué es ROLLUP?

Cuando agrupa datos con GROUP BY, obtiene una fila por cada grupo. Pero a menudo también necesita subtotales para cada agrupación y un total general para todas las filas. Eso es exactamente lo que hace ROLLUP.

ROLLUP es una extensión de GROUP BY que añade automáticamente filas de resumen al conjunto de resultados, proporcionando subtotales acumulados en cada nivel de la jerarquía de agrupación y un total general final.

Configuración de datos de ejemplo

Creemos una tabla sencilla de sales para practicar. Almacena la región, la categoría de producto y el importe de venta de cada transacción. Ejecute las instrucciones siguientes para crearla y rellenarla.

CREATE TABLE sales (
  region   TEXT,
  category TEXT,
  amount   NUMERIC
);

INSERT INTO sales VALUES
  ('East',  'Electronics', 500),
  ('East',  'Electronics', 300),
  ('East',  'Clothing',    150),
  ('West',  'Electronics', 700),
  ('West',  'Clothing',    200),
  ('West',  'Clothing',    100);

Primero, un GROUP BY normal

Antes de usar ROLLUP, veamos qué resultado obtenemos con un GROUP BY normal. La consulta siguiente devuelve un total por cada par (region, category), sin subtotales ni total general.

SELECT region, category, SUM(amount) AS total
FROM   sales
GROUP  BY region, category
ORDER  BY region, category;

Introducción a GROUP BY ROLLUP

Sustituya GROUP BY por GROUP BY ROLLUP(...) y SQL añadirá automáticamente las filas de subtotal. Las columnas dentro de ROLLUP() forman una jerarquía, y se produce un subtotal para cada nivel de esa jerarquía, además de un total general final.

SELECT region, category, SUM(amount) AS total
FROM   sales
GROUP  BY ROLLUP(region, category)
ORDER  BY region, category;

Lectura del resultado de ROLLUP

El resultado de ROLLUP contiene tres tipos de filas:

  • Filas de detalle: una fila por cada combinación (region, category), igual que con un GROUP BY normal.
  • Filas de subtotal: una fila por cada región con category = NULL, que muestra el total regional.
  • Fila del total general: una fila en la que tanto region como category son NULL, que muestra el total global.

Los valores NULL actúan como marcadores que indican el nivel resumido.

Usar COALESCE para etiquetar los NULL

Los marcadores NULL pueden resultar confusos para los usuarios finales. Envuelva cada columna en COALESCE para reemplazarlos por etiquetas significativas, como 'Todas las categorías' y 'Total general'.

SELECT
  COALESCE(region,   'Grand Total')    AS region,
  COALESCE(category, 'All Categories') AS category,
  SUM(amount)                          AS total
FROM   sales
GROUP  BY ROLLUP(region, category)
ORDER  BY region, category;

ROLLUP de una sola columna

ROLLUP también funciona con una sola columna. Cuando escribe ROLLUP(region), obtiene una fila por cada región y una única fila de total general al final. Es la forma más sencilla y resulta útil para cualquier informe que necesite un total acumulado debajo de las filas de detalle.

SELECT
  COALESCE(region, 'Grand Total') AS region,
  SUM(amount)                     AS total
FROM   sales
GROUP  BY ROLLUP(region)
ORDER  BY region;

ROLLUP de tres niveles

Puede pasar tres o más columnas a ROLLUP para crear jerarquías más profundas. Con ROLLUP(year, region, category) obtendría subtotales por year+region, subtotales por year y un total general; cada columna adicional añade otro nivel de resumen.

-- Extend the demo with a year column
SELECT
  COALESCE(CAST(yr AS TEXT), 'All Years')     AS year,
  COALESCE(region,   'All Regions')            AS region,
  COALESCE(category, 'All Categories')         AS category,
  SUM(amount)                                  AS total
FROM (
  SELECT 2024 AS yr, region, category, amount FROM sales
  UNION ALL
  SELECT 2025 AS yr, region, category, amount FROM sales
) t
GROUP  BY ROLLUP(yr, region, category)
ORDER  BY yr, region, category;

Detectar filas de resumen con GROUPING()

La función GROUPING() devuelve 1 cuando el valor de la columna en esa fila es un NULL generado por ROLLUP (un marcador de resumen) y 0 cuando es un valor real de los datos. Esto permite distinguir los valores NULL reales de los NULL de resumen generados por ROLLUP.

SELECT
  region,
  category,
  SUM(amount)        AS total,
  GROUPING(region)   AS is_region_summary,
  GROUPING(category) AS is_cat_summary
FROM   sales
GROUP  BY ROLLUP(region, category)
ORDER  BY region, category;

Filtrar las filas de resumen

Como ROLLUP añade filas después de la agregación, no puede filtrarlas con WHERE. Utilice HAVING o envuelva toda la consulta en una subconsulta. El ejemplo siguiente conserva únicamente los subtotales regionales (filas en las que category es un NULL de ROLLUP, pero region es un valor real).

SELECT region, SUM(amount) AS regional_total
FROM   sales
GROUP  BY ROLLUP(region, category)
HAVING GROUPING(category) = 1
   AND GROUPING(region)   = 0
ORDER  BY region;

ROLLUP frente a GROUPING SETS

ROLLUP(a, b) es una abreviatura de un conjunto específico de GROUPING SETS. Las dos consultas siguientes son exactamente equivalentes; ROLLUP simplemente evita que tenga que escribir manualmente cada nivel de agrupación.

-- Using ROLLUP (concise)
SELECT region, category, SUM(amount) AS total
FROM   sales
GROUP  BY ROLLUP(region, category);

-- Equivalent explicit GROUPING SETS
SELECT region, category, SUM(amount) AS total
FROM   sales
GROUP  BY GROUPING SETS(
  (region, category),
  (region),
  ()
);

Comprobación rápida

Compruebe su comprensión de ROLLUP con esta pregunta.

Resumen de la lección

¡Muy bien! Este es un resumen de lo que aprendió sobre ROLLUP:

  • GROUP BY ROLLUP(a, b) genera automáticamente subtotales para cada nivel de la jerarquía de columnas y un total general para todas las filas.
  • Las filas de resumen se marcan con NULL en las columnas resumidas. Use COALESCE para asignarles etiquetas legibles.
  • La función GROUPING() devuelve 1 para los NULL generados por ROLLUP y 0 para los valores reales de los datos, por lo que puede distinguirlos.
  • Use HAVING GROUPING(...) = 1 para filtrar únicamente las filas de resumen.
  • ROLLUP(a, b) es una abreviatura de GROUPING SETS((a, b), (a), ()).

ROLLUP es la herramienta ideal cuando su informe necesita subtotales y un total general sin tener que escribir consultas UNION complejas.

Preguntas frecuentes

¿La lección «ROLLUP para subtotales» es gratis?

Sí — el texto completo de «ROLLUP para subtotales» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de SQL Academy, actualiza a CoddyKit PRO. El curso de SQL Academy incluye 4 lecciones en total.

¿Qué aprenderé en «ROLLUP para subtotales»?

Subtotales acumulados y totales generales Practicas SQL Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar SQL Academy?

No se requiere experiencia previa. SQL Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «ROLLUP para subtotales»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de SQL Academy?

Sí. Cada lección de SQL Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Más allá de un único GROUP BY
  2. ROLLUP para subtotales
  3. CUBE para todas las combinaciones
  4. GROUPING SETS explicado
← Volver a SQL Academy