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.
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 deNULLen esta columna.SUM(montant)suma los montos noNULL.AVG(montant)calcula su promedio.
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.
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.
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.
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.
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(*) > 5en lugar deHAVING. - Cuenta después de un join que ha multiplicado las líneas.
- Olvídese de que
COUNT(colonne)ignora los valores deNULL. - Mezclar distintos periodos en un mismo indicador.
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.
