Al terminar, podrás
- Convertir filas en un resumen por categoría.
- Combinar GROUP BY con varias agregaciones.
- Reconocer columnas que no pueden aparecer sueltas en una consulta agrupada.
Recupera lo aprendido: ¿Qué devuelve COUNT(*) sin GROUP BY: una fila de resumen o una fila por registro?
La idea clave
GROUP BY divide las filas en conjuntos que comparten uno o varios valores. Después, cada función de agregación se calcula por separado dentro de cada grupo.
Pregunta obligatoria antes y después de agrupar: “¿qué representa una fila?”. Antes de GROUP BY estado, una fila representa un pedido; después, una fila representa un estado. Si una columna no tiene un único valor para ese nuevo tipo de fila, no puede aparecer como detalle sin otra regla.
Modelo mental: imagina cajas etiquetadas. Cada fila entra en la caja que corresponde a su valor de agrupación; al final obtienes una fila de resumen por caja.
La sintaxis básica
SELECT columna_grupo,
COUNT(*) AS cantidad
FROM tabla
WHERE condición_de_fila
GROUP BY columna_grupo
ORDER BY columna_grupo;Para escribir SQL portable, cada expresión seleccionada que no sea una agregación debe identificar el grupo. Algunos motores o modos de compatibilidad aceptan columnas de detalle fuera de GROUP BY, pero el valor elegido puede no expresar una regla fiable. Evita depender de ese comportamiento.
Ejemplo paso a paso
| estado | filas |
|---|---|
| cancelado | 3 |
| enviado | 9 |
| pendiente | 6 |
Además de contar pedidos, queremos sumar el importe de cada estado.
SELECT estado,
COUNT(*) AS pedidos,
ROUND(SUM(total), 2) AS total
FROM pedidos
GROUP BY estado
ORDER BY estado;| estado | pedidos | total |
|---|---|---|
| cancelado | 3 | 1272,90 |
| enviado | 9 | 1818,70 |
| pendiente | 6 | 840,30 |
Cómo funciona
- El motor lee el valor de
estadode cada pedido. - Forma tres grupos: cancelado, enviado y pendiente.
COUNT(*)ySUM(total)se calculan dentro de cada grupo.ORDER BYordena las tres filas finales, no los pedidos originales.
Un error habitual
Seleccionar una columna que no define el grupo
SELECT estado, fecha, COUNT(*)
FROM pedidos
GROUP BY estado;Dentro de un mismo estado existen varias fechas. fecha no tiene un único valor representativo. En SQL portable, agrúpala también si necesitas una fila por estado y fecha, o retírala del resultado. Aunque un motor permita esa columna sin agrupar, no dependas de qué fecha elija.
Practica con datos
Laboratorio SQL
Resuelve la consulta
Cuenta cuántos pedidos hay en cada estado. Devuelve estado y el recuento con alias pedidos; ordena las filas por estado.
Resultado esperado: 3 filas con estado, pedidos. Respeta el orden de filas solicitado.
Ver tablas y datos
Cargando la estructura del ejercicio…
Selecciona estado.
Añade COUNT(*).
Agrupa por estado.
Solución
SELECT estado, COUNT(*) AS pedidos FROM pedidos GROUP BY estado ORDER BY estado;Cada estado aparece una vez y muestra cuántos pedidos pertenecen a ese grupo.
Puedes consultar la solución y volver a intentarlo. La práctica se completa cuando tu consulta funciona.
La consulta usa datos ficticios y se ejecuta solo en este navegador.
Fuentes técnicas consultadas
Las fuentes explican que las expresiones de GROUP BY asignan cada fila a un grupo y que cada grupo produce una fila de salida antes de ordenar el resultado.
- PostgreSQL: expresiones de tabla, GROUP BY y HAVING
- PostgreSQL: procesamiento de SELECT
- SQLite: procesamiento de consultas agrupadas
Comprueba si puedes explicarlo
Si agrupas productos por categoria y después añades stock al GROUP BY, ¿qué representa ahora una fila?
Ver respuesta razonada
Una combinación de categoría y stock, no una categoría completa. Añadir columnas al GROUP BY cambia la pregunta y puede aumentar el número de grupos.
Responde antes de abrir la explicación. Si necesitaste ayuda, cierra la respuesta y vuelve a explicarlo con tus palabras antes de dar la lección por aprendida.
Qué debes recordar
- GROUP BY crea un grupo por cada combinación distinta de sus expresiones.
- Las agregaciones se calculan de forma independiente dentro de cada grupo.
- ORDER BY actúa sobre las filas resumidas que ya produjo la agrupación.
A continuación: Continúa con Filtra grupos con HAVING.