/

/

SQL GROUP BY y HAVING: Agregación de Datos Explicada

Content

SQL GROUP BY y HAVING: Agregación de Datos Explicada

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.

Share this

More Articles