GROUPING SETS explicado
Elija exactamente las agrupaciones que desea
GROUPING SETS explicado es una lección gratuita de SQL Academy en CoddyKit. Esta es la lección 4 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é son los GROUPING SETS?
Cuando escribe una cláusula GROUP BY, define un conjunto de columnas por el que agrupar. Sin embargo, a veces necesita varias agrupaciones distintas en una sola consulta, sin ejecutarla varias veces ni usar UNION ALL.
GROUPING SETS le permite especificar exactamente las agrupaciones que desea, en una sola pasada por los datos. Cada conjunto de la lista produce sus propias filas agregadas en el resultado.
Tabla de ejemplo: sales
Usaremos una tabla sales durante toda esta lección. Registra transacciones por región, categoría de producto e importe.
Ejecute el código para crear y rellenar la tabla, de modo que pueda seguir cada ejemplo.
CREATE TABLE sales (
region TEXT,
category TEXT,
amount NUMERIC
);
INSERT INTO sales VALUES
('East', 'Electronics', 500),
('East', 'Clothing', 200),
('West', 'Electronics', 300),
('West', 'Clothing', 400),
('North', 'Electronics', 150),
('North', 'Clothing', 250);El método antiguo: UNION ALL
Antes de que existiera GROUPING SETS, obtener totales en varios niveles implicaba escribir consultas independientes y concatenarlas con UNION ALL. Este enfoque es repetitivo, más difícil de leer y analiza la tabla varias veces.
El ejemplo siguiente devuelve los totales por región Y los totales por categoría mediante tres instrucciones SELECT independientes.
SELECT region, NULL AS category, SUM(amount) AS total
FROM sales
GROUP BY region
UNION ALL
SELECT NULL, category, SUM(amount)
FROM sales
GROUP BY category
UNION ALL
SELECT NULL, NULL, SUM(amount)
FROM sales;Sintaxis de GROUPING SETS
La cláusula GROUPING SETS se coloca dentro de un GROUP BY normal o en su lugar. Debe indicar cada agrupación deseada como una lista de columnas entre paréntesis. Un conjunto vacío () representa el total general, es decir, ninguna agrupación.
Esta única consulta hace exactamente lo mismo que el UNION ALL de tres partes anterior, pero de forma más concisa y con un solo análisis de la tabla.
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
(region),
(category),
()
);Cómo leer el resultado
Cada fila del resultado pertenece exactamente a un conjunto de agrupación. Cuando una columna no forma parte del conjunto de agrupación activo, su valor es NULL.
- Una fila con
region = 'East'ycategory = NULLpertenece al conjunto(region). - Una fila con
region = NULLycategory = 'Electronics'pertenece al conjunto(category). - Una fila en la que ambas columnas son NULL es el total general del conjunto
().
Esos valores NULL son estructurales: significan «todos los valores» de esa dimensión, no datos faltantes.
Conjuntos de agrupación con varias columnas
Cada conjunto de agrupación puede contener más de una columna. El conjunto (region, category) agrupa por ambas columnas conjuntamente, igual que un GROUP BY region, category normal.
Al combinarlo con conjuntos individuales y el total general, obtiene un resumen de cuatro niveles en una sola consulta.
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
(region, category),
(region),
(category),
()
);La función GROUPING()
Como NULL puede significar que la columna no se agrupó o que realmente faltan datos, SQL proporciona la función GROUPING() para distinguir ambos casos.
GROUPING(col) devuelve 1 cuando la columna se omitió del conjunto de agrupación actual (es decir, su NULL es estructural), y 0 cuando la columna forma parte de la agrupación (o contiene un valor NULL real).
SELECT
region,
category,
SUM(amount) AS total,
GROUPING(region) AS is_region_total,
GROUPING(category) AS is_category_total
FROM sales
GROUP BY GROUPING SETS (
(region),
(category),
()
);Sustitución de las etiquetas NULL
Un patrón habitual consiste en reemplazar los valores NULL estructurales por una etiqueta descriptiva para facilitar la lectura de los informes. Use CASE WHEN GROUPING(...) = 1 THEN 'All ...' ELSE col END para sustituir la etiqueta únicamente en las filas de resumen.
SELECT
CASE WHEN GROUPING(region) = 1 THEN 'All Regions' ELSE region END AS region,
CASE WHEN GROUPING(category) = 1 THEN 'All Categories' ELSE category END AS category,
SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
(region),
(category),
()
);GROUPING SETS frente a ROLLUP
ROLLUP(a, b) es una forma abreviada que se expande a los conjuntos de agrupación (a, b), (a), (): siempre añade subtotales siguiendo una jerarquía y el total general.
GROUPING SETS le ofrece un control total: usted elige exactamente qué combinaciones aparecen. Si no necesita la jerarquía completa, puede omitir niveles. Las dos consultas siguientes producen el mismo resultado.
-- Using ROLLUP
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),
()
);GROUPING SETS frente a CUBE
CUBE(a, b) genera todas las combinaciones posibles de las columnas indicadas: (a, b), (a), (b), (). Es útil para el análisis entre dimensiones, pero produce muchas filas.
GROUPING SETS le permite elegir únicamente las combinaciones que le interesan, de modo que el resultado sea más específico y la consulta más rápida.
-- CUBE produces 4 grouping sets for 2 columns
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY CUBE(region, category);
-- GROUPING SETS: omit the (category)-only set if not needed
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
(region, category),
(region),
()
);Caso práctico: panel de ventas
Un panel real suele necesitar detalles a nivel de fila, subtotales por departamento y un total general, todo en el mismo conjunto de resultados. GROUPING SETS lo hace sencillo sin agregaciones del lado de la aplicación ni múltiples solicitudes al servidor.
Esta consulta devuelve filas detalladas por región y categoría, subtotales únicamente por región y una sola fila con el total general; todo ordenado para que el total general aparezca al final.
SELECT
COALESCE(region, 'TOTAL') AS region,
COALESCE(category, 'ALL') AS category,
SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
(region, category),
(region),
()
)
ORDER BY
GROUPING(region),
region NULLS LAST,
GROUPING(category),
category NULLS LAST;Comprobación rápida
Compruebe cuánto ha entendido sobre GROUPING SETS.
Resumen de la lección
Esto es lo que aprendió sobre GROUPING SETS:
- GROUPING SETS le permite definir varias combinaciones de agrupación en una sola consulta, sustituyendo los patrones repetitivos con UNION ALL.
- Cada conjunto se indica como una lista de columnas entre paréntesis dentro de
GROUP BY GROUPING SETS (...). Un conjunto vacío()produce el total general. - Las columnas que no pertenecen al conjunto activo aparecen como NULL en esa fila; use
GROUPING(col)para detectar estos valores NULL estructurales. - ROLLUP y CUBE son formas abreviadas prácticas para patrones habituales, pero GROUPING SETS le ofrece un control total y preciso sobre las agrupaciones que se incluyen.
- Combine estas funciones con COALESCE o CASE WHEN GROUPING(...) para sustituir los valores NULL por etiquetas legibles en los informes.
Preguntas frecuentes
¿La lección «GROUPING SETS explicado» es gratis?
Sí — el texto completo de «GROUPING SETS explicado» 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 «GROUPING SETS explicado»?
Elija exactamente las agrupaciones que desea 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 4 de 4.
¿Cuánto tiempo toma la lección «GROUPING SETS explicado»?
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
- Más allá de un único GROUP BY
- ROLLUP para subtotales
- CUBE para todas las combinaciones
- GROUPING SETS explicado