Objetivo
Calcular KPIs por grupo sin mezclar filtros de filas y grupos.
Explicación
GROUP BY cambia el grain del resultado: de una fila por pedido a una fila por grupo. HAVING filtra después de agregar. Cada columna seleccionada debe estar agregada o formar parte del GROUP BY. En un equipo de datos, SQL no se evalúa sólo por devolver filas: debe responder una pregunta de negocio, conservar el grain correcto y permitir que otra persona valide el resultado. Esta práctica usa el ecommerce del curso para obligarte a reconciliar conteos y totales, igual que harías antes de publicar una métrica en un dashboard. Para trabajar GROUP BY, HAVING y métricas de forma profesional, no te quedes con el ejemplo: identifica la entrada, ejecuta el caso base, provoca al menos un caso incorrecto y compara el resultado con un control independiente. En este laboratorio el criterio de salida es concreto: Una fila por customer_id con orders, revenue y avg_order_value. La verificación principal será: SUM(revenue) debe coincidir con SUM(amount) de pedidos incluidos. Si no puedes explicar por qué pasa esa comprobación, vuelve al paso anterior antes de continuar.
Contexto profesional
En un equipo de datos, SQL no se evalúa sólo por devolver filas: debe responder una pregunta de negocio, conservar el grain correcto y permitir que otra persona valide el resultado. Esta práctica usa el ecommerce del curso para obligarte a reconciliar conteos y totales, igual que harías antes de publicar una métrica en un dashboard.
Ejemplo real
SELECT customer_id, COUNT(*) AS orders, SUM(amount) AS revenue
FROM orders
WHERE status='COMPLETED'
GROUP BY customer_id
HAVING COUNT(*) >= 2
ORDER BY revenue DESC;
Archivos o datos de entrada
- data/ecommerce_customers.csv
- data/ecommerce_orders.csv
Práctica guiada
Obtén facturación y ticket medio por cliente.
Laboratorio paso a paso
- Prepara el entorno y localiza los datos/archivos de entrada: data/ecommerce_customers.csv, data/ecommerce_orders.csv. Antes de modificar nada, anota el número de filas, columnas u objetos que esperas usar.
- Reproduce el ejemplo real de la lección y guarda la salida. No avances hasta poder explicar qué hace cada bloque relacionado con «GROUP BY, HAVING y métricas».
- Ejecuta la práctica guiada: Obtén facturación y ticket medio por cliente. Documenta el comando, consulta o acción exacta y el resultado obtenido.
- Resuelve el reto sin mirar la solución: Devuelve sólo clientes con al menos 2 pedidos y revenue > 150. Si falla, registra el mensaje de error y formula una hipótesis antes de cambiar código.
- Compara tu resultado con el criterio esperado: Una fila por customer_id con orders, revenue y avg_order_value. Después ejecuta la comprobación: SUM(revenue) debe coincidir con SUM(amount) de pedidos incluidos.
- Provoca deliberadamente un caso problemático relacionado con este error frecuente: Poner SUM(amount)>150 en WHERE es inválido porque aún no existe el grupo.. Comprueba que sabes detectarlo y corregirlo.
Reto sin ayuda
Devuelve sólo clientes con al menos 2 pedidos y revenue > 150.
Resultado esperado
Una fila por customer_id con orders, revenue y avg_order_value.
Cómo verificarlo
SUM(revenue) debe coincidir con SUM(amount) de pedidos incluidos.
Checklist de validación
- El resultado cumple: Una fila por customer_id con orders, revenue y avg_order_value.
- Has ejecutado esta verificación y puedes explicar el resultado: SUM(revenue) debe coincidir con SUM(amount) de pedidos incluidos.
- Has probado al menos un caso límite o dato inválido y el comportamiento es explícito, no silencioso.
- Puedes repetir la práctica desde cero sin copiar la solución y dejar evidencia (consulta, commit, captura o salida de consola).
Pista específica
Comprueba el grain: una fila por cliente.
Solución paso a paso
1) Empieza reproduciendo el caso base con los datos indicados. 2) Aplica esta estrategia específica: Añade AVG(amount) y HAVING COUNT(*)>=2 AND SUM(amount)>150. 3) Usa como referencia técnica el ejemplo de la lección (SELECT customer_id, COUNT(*) AS orders, SUM(amount) AS revenue FROM orders WHERE status=’COMPLETED’ GROUP BY customer_id HAVING COUNT(*) >= 2 ORDER BY revenue DESC;). 4) Ejecuta la verificación: SUM(revenue) debe coincidir con SUM(amount) de pedidos incluidos. 5) Compara con el resultado esperado: Una fila por customer_id con orders, revenue y avg_order_value. 6) Repite el reto cambiando un dato o condición para demostrar que entiendes el comportamiento y no has obtenido el resultado por casualidad. Si aparece el error «Poner SUM(amount)>150 en WHERE es inválido porque aún no existe el grupo.», corrige la causa antes de continuar; no ocultes el fallo ni cambies el resultado esperado para que la prueba pase.
Errores frecuentes
- Poner SUM(amount)>150 en WHERE es inválido porque aún no existe el grupo.
Qué debes recordar
Debes poder explicar qué filas produce la consulta y por qué.
Preguntas de entrevista
- ¿Cómo demostrarías que una consulta no está duplicando métricas? Aplícalo concretamente a «GROUP BY, HAVING y métricas».
- ¿Qué comprobaciones harías antes de publicar este resultado a negocio? Explica qué evidencia enseñarías al revisor.
Siguiente paso
Ahora relacionarás tablas con JOIN.
Recursos de esta lección
Preparando contenido…
Quiz de la lección
¿Cuándo se evalúa HAVING?