Data Analyst

GROUP BY y HAVING: creación de KPI en SQL

Transforma las líneas de ventas en indicadores confiables por ciudad, categoría o período.

Equipo de SQL.tn10 min
Ilustración de líneas de datos agrupadas y luego transformadas en indicadores visuales.

Pasar del detalle a un indicador

Una tabla de pedidos normalmente contiene una fila por transaction. En cambio, un panel espera una línea por ciudad, por categoría o por mes, acompañada de indicadores como la facturación y la cesta media.

GROUP BY cambia el nivel de detalle del resultado. Todas las filas que comparten el mismo valor se agrupan antes de calcular las funciones de agregación.

Los datos de este artículo son ficticios. Las cantidades y resultados se utilizan únicamente para explicar el método.

COUNT, SUM y AVG responden a tres preguntas diferentes

COUNT cuenta, SUM suma y AVG calcula un promedio. Estas funciones colapsan varias filas en un valor sintético.

En un informe de ventas, puede contar los pedidos, sumar su monto y calcular el valor promedio del pedido en la misma consulta.

  • COUNT(*) cuenta las filas del grupo.
  • COUNT(colonne) ignora los valores de NULL en esta columna.
  • SUM(montant) suma los montos no NULL.
  • AVG(montant) calcula su promedio.
Indicadores globales de pedidos
SELECT
  COUNT(*) AS nombre_commandes,
  SUM(montant) AS chiffre_affaires,
  ROUND(AVG(montant), 2) AS panier_moyen
FROM commandes;

GROUP BY crea una línea por grupo

Para obtener una fila por ciudad, añade ville al resultado y la cláusula GROUP BY. A continuación, cada agregación se calcula por separado para Túnez, Sfax y las demás ciudades presentes.

Como regla práctica, cualquier columna mostrada en SELECT que no esté agregada debería aparecer en GROUP BY.

Número de clientes por ciudad
SELECT
  ville,
  COUNT(*) AS nombre_clients
FROM clients
GROUP BY ville
ORDER BY nombre_clients DESC;

WHERE filtra filas antes del cálculo

WHERE elimina filas antes de formar grupos. Para construir los KPI para el año 2026, filtre las órdenes por fecha antes de ejecutar GROUP BY.

Esta distinción es importante: las líneas excluidas por WHERE no participan en el conteo, la suma ni el promedio.

Volumen de negocios por cliente en 2026
SELECT
  id_client,
  SUM(montant) AS chiffre_affaires
FROM commandes
WHERE date_commande >= DATE '2026-01-01'
  AND date_commande < DATE '2027-01-01'
GROUP BY id_client;

HAVING filtra grupos después del cálculo

HAVING ocurre después de la agregación. Por ejemplo, le permite conservar sólo ciudades con al menos cinco pedidos o una facturación superior a un umbral.

Utiliza WHERE para una condición en una fila original y HAVING para una condición en un grupo o agregación.

Retener clientes con al menos cinco pedidos
SELECT
  id_client,
  COUNT(*) AS nombre_commandes
FROM commandes
GROUP BY id_client
HAVING COUNT(*) >= 5
ORDER BY nombre_commandes DESC;

Armar una consulta de KPI completa

Para analizar las ventas por ciudad, primero debe vincular los pedidos a los clientes, filtrar el período, agrupar por ciudad y luego filtrar los grupos no representativos.

El alias chiffre_affaires se puede reutilizar en ORDER BY con el simulador de sitio. La cláusula HAVING conserva la expresión de agregación completa para permanecer explícita.

KPI de ventas por ciudad
SELECT
  c.ville,
  COUNT(co.id_commande) AS nombre_commandes,
  SUM(co.montant) AS chiffre_affaires,
  ROUND(AVG(co.montant), 2) AS panier_moyen
FROM clients AS c
INNER JOIN commandes AS co
  ON c.id_client = co.id_client
WHERE co.date_commande >= DATE '2026-01-01'
  AND co.date_commande < DATE '2027-01-01'
GROUP BY c.ville
HAVING COUNT(co.id_commande) >= 5
ORDER BY chiffre_affaires DESC;

Errores que distorsionan un KPI

La correcta agregación depende tanto del nivel de detalle como de la fórmula. Antes de publicar un indicador, comprueba qué representa exactamente cada línea del resultado.

  • Mostrar una columna no agregada sin agregarla a GROUP BY.
  • Utiliza WHERE COUNT(*) > 5 en lugar de HAVING.
  • Cuenta después de un join que ha multiplicado las líneas.
  • Olvídese de que COUNT(colonne) ignora los valores de NULL.
  • Mezclar distintos periodos en un mismo indicador.
Comprobación sencilla: primero calcule el total general y luego compárelo con la suma de los grupos. Una discrepancia debe explicarse por el filtro o los valores NULL.

Tu lista de control antes de compartir el resultado

Establezca el nivel esperado (una fila por ciudad, cliente o mes) y luego elija las agregaciones. Aplica el filtro de período con WHERE, el umbral de negocio con HAVING y una clasificación legible con ORDER BY.

Finalmente, comprueba algunos grupos a mano y documente la definición de KPI. Una consulta breve pero ambigua sigue siendo menos útil que un cálculo explícito y reproducible.

Encuentra tu punto de partida.

Responde a diez preguntas y recibe una recomendación pedagógica adecuada.

Hacer la prueba gratuita
GROUP BY y HAVING en SQL: guía práctica — SQL.tn