SQL GROUP BY y HAVING: Agregación de Datos Explicada
Introducción
GROUP BY y HAVING son cláusulas fundamentales para resumir y analizar datos en SQL. Permiten agrupar filas y aplicar funciones de agregación como SUM, COUNT, AVG, etc.
GROUP BY: Fundamentos
Sintaxis Básica
SELECT columna, FUNCION_AGREGADA(columna)
FROM tabla
GROUP BY columna;
Ejemplo Simple
Tabla: ventas
| id | vendedor | producto | cantidad | precio |
|----|----------|----------|----------|--------|
| 1 | Ana | Laptop | 2 | 1000 |
| 2 | Carlos | Mouse | 10 | 25 |
| 3 | Ana | Teclado | 5 | 50 |
| 4 | Carlos | Laptop | 1 | 1000 |
| 5 | María | Mouse | 8 | 25 |
SELECT vendedor, SUM(cantidad * precio) as total_ventas
FROM ventas
GROUP BY vendedor;
Resultado:
| vendedor | total_ventas |
|----------|--------------|
| Ana | 2250 |
| Carlos | 1250 |
| María | 200 |
---
Funciones de Agregación
| Función | Descripción | Ejemplo |
|---------|-------------|---------|
| COUNT() | Cuenta filas | COUNT(*) o COUNT(columna) | | SUM() | Suma valores | SUM(precio) | | AVG() | Promedio | AVG(cantidad) | | MAX() | Valor máximo | MAX(precio) | | MIN() | Valor mínimo | MIN(precio) | | GROUP_CONCAT() | Concatena valores | GROUP_CONCAT(producto) |
Ejemplos de Cada Función
SELECT
vendedor,
COUNT(*) as num_ventas,
SUM(cantidad) as total_unidades,
AVG(precio) as precio_promedio,
MAX(precio) as precio_max,
MIN(precio) as precio_min
FROM ventas
GROUP BY vendedor;
---
GROUP BY con Múltiples Columnas
SELECT vendedor, producto, SUM(cantidad) as total
FROM ventas
GROUP BY vendedor, producto;
Resultado:
| vendedor | producto | total |
|----------|----------|-------|
| Ana | Laptop | 2 |
| Ana | Teclado | 5 |
| Carlos | Mouse | 10 |
| Carlos | Laptop | 1 |
| María | Mouse | 8 |
---
HAVING: Filtrar Grupos
HAVING filtra los resultados DESPUÉS de la agregación, a diferencia de WHERE que filtra ANTES.
WHERE vs HAVING
-- WHERE: filtra filas antes de agrupar
SELECT vendedor, SUM(cantidad * precio) as total
FROM ventas
WHERE precio > 30
GROUP BY vendedor;
Ejemplo Práctico
Vendedores con más de 5 productos vendidos:
SELECT vendedor, SUM(cantidad) as total_productos
FROM ventas
GROUP BY vendedor
HAVING SUM(cantidad) > 5;
Resultado:
| vendedor | total_productos |
|----------|-----------------|
| Carlos | 11 |
| Ana | 7 |
| María | 8 |
---
Orden de Ejecución SQL
Es crucial entender el orden:
1. FROM - Selecciona la tabla 2. WHERE - Filtra filas 3. GROUP BY - Agrupa las filas 4. HAVING - Filtra los grupos 5. SELECT - Selecciona columnas 6. ORDER BY - Ordena resultados 7. LIMIT - Limita resultados
---
Casos de Uso Avanzados
1. Ventas por Mes
SELECT
DATE_FORMAT(fecha, '%Y-%m') as mes,
COUNT(*) as num_ventas,
SUM(total) as ingresos
FROM pedidos
GROUP BY DATE_FORMAT(fecha, '%Y-%m')
ORDER BY mes;
2. Productos Más Vendidos
SELECT
producto,
SUM(cantidad) as unidades_vendidas,
SUM(cantidad * precio) as ingresos
FROM ventas
GROUP BY producto
ORDER BY unidades_vendidas DESC
LIMIT 10;
3. Clientes con Múltiples Compras
SELECT
cliente_id,
COUNT(*) as num_compras,
AVG(total) as ticket_promedio
FROM pedidos
GROUP BY cliente_id
HAVING COUNT(*) > 3
ORDER BY num_compras DESC;
4. Análisis de Cohortes
SELECT
DATE_FORMAT(fecha_registro, '%Y-%m') as cohorte,
COUNT(*) as nuevos_usuarios,
SUM(CASE WHEN ultima_compra IS NOT NULL THEN 1 ELSE 0 END) as compradores
FROM usuarios
GROUP BY DATE_FORMAT(fecha_registro, '%Y-%m');
---
GROUP BY con ROLLUP
ROLLUP genera subtotales y gran total:
SELECT
COALESCE(vendedor, 'TOTAL') as vendedor,
COALESCE(producto, 'Subtotal') as producto,
SUM(cantidad) as total
FROM ventas
GROUP BY vendedor, producto WITH ROLLUP;
---
Errores Comunes
Error 1: Columna no está en GROUP BY
-- Error
SELECT vendedor, producto, SUM(cantidad)
FROM ventas
GROUP BY vendedor;
Error 2: Usar WHERE con Agregaciones
-- Error
SELECT vendedor, COUNT(*)
FROM ventas
WHERE COUNT(*) > 5
GROUP BY vendedor;
Error 3: Confundir COUNT(*) con COUNT(columna)
-- COUNT(*) cuenta todas las filas
-- COUNT(columna) cuenta filas donde columna no es NULL
---
Optimización
1. Índices para GROUP BY
CREATE INDEX idx_vendedor ON ventas(vendedor);
2. Filtrar Antes con WHERE
-- Más eficiente: reduce datos antes de agrupar
SELECT vendedor, SUM(cantidad)
FROM ventas
WHERE fecha >= '2024-01-01'
GROUP BY vendedor;
3. Limitar Resultados
SELECT producto, SUM(cantidad) as total
FROM ventas
GROUP BY producto
ORDER BY total DESC
LIMIT 100;
Conclusión
GROUP BY y HAVING son herramientas esenciales para análisis de datos. Dominarlas te permitirá crear reportes poderosos y extraer insights valiosos de tus datos.
---
Consejo: Usa AI2sql para generar consultas GROUP BY complejas automáticamente y ahorra tiempo en tu análisis de datos.
Inicia tu prueba gratuita
Share this
More Articles
TOOLS
Build Your Own AI Agent Team in 15 Min — Free OpenClaw Guide
Feb 5, 2026
TOOLS
OpenClaw AI Assistant: Local 24/7 Automation Guide 2026
Feb 4, 2026
TOOLS
SQL WITH Clause (CTE): Complete Guide with Examples
Jan 14, 2026
TOOLS
MySQL to PostgreSQL Migration: Complete 2026 Guide with Syntax Conversion
Jan 14, 2026
TOOLS
SQL vs Excel: When Should You Make the Switch? [2026]
Jan 14, 2026
Copyright © AI2sql 2026
Cross Regions Technology
13553 Atlantic Blvd, Suite 201
FL 32225
Company