Resúmenes por grupo, filtros sobre grupos y agregación condicional.
0 / 6 retos resueltos📘 Clase 9 · «agrupar y contar», «filtrar por agregaciones con HAVING» · Solemne 2
Al terminar esta práctica podrás…
Agrupar filas por una o varias columnas (o expresiones) con GROUP BY.
Filtrar grupos con HAVING y distinguirlo de WHERE.
Construir métricas con agregación condicional: SUM(CASE WHEN … THEN 1 ELSE 0 END).
Aplicar el orden lógico WHERE → GROUP BY → HAVING → ORDER BY.
GROUP BY forma un grupo por cada valor distinto de las columnas indicadas y aplica las
funciones de agregación dentro de cada grupo: una fila de resultado por grupo.
WHERE filtra filas antes de agrupar; HAVING filtra grupos después de agrupar,
y por eso puede usar funciones de grupo.
Regla de oro: toda columna del SELECT que no esté dentro de una función de grupo debe aparecer en
el GROUP BY.
La agregación condicional permite calcular varias métricas en una sola pasada. Es exactamente lo que pedía la
Solemne 2 («cantidad de hombres menos cantidad de mujeres»): SUM(CASE WHEN sexo = 'M' THEN 1 ELSE 0 END).
Sintaxis
SELECT col_grupo, COUNT(*), AVG(col)
FROM tabla
WHERE condición_de_filas
GROUP BY col_grupo
HAVING condición_de_grupos
ORDER BY …;
GROUP BY
Una fila por cada valor distinto de las columnas agrupadas.
HAVING
Filtra grupos: HAVING COUNT(*) > 5.
WHERE vs HAVING
WHERE = filas (antes). HAVING = grupos (después).
Varias columnas
GROUP BY department_id, job_id = un grupo por combinación.
Agrupar por expresión
GROUP BY strftime('%Y', hire_date).
Agregación condicional
SUM(CASE WHEN cond THEN 1 ELSE 0 END) cuenta solo lo que cumple.
1 · Ejemplos guiados · ejecuta y modifica cada bloque
01Empleados por departamento
Una fila por departamento con su conteo, del más numeroso al menor.
sql-group-by.sql
Presiona «ejecutar» para ver el resultado.
02Varias métricas por cargo
Agrupamos por job_id y calculamos conteo, promedio y máximo.
sql-group-by.sql
Presiona «ejecutar» para ver el resultado.
03HAVING: filtrar grupos
Solo departamentos con más de 5 empleados.
sql-group-by.sql
Presiona «ejecutar» para ver el resultado.
04WHERE y HAVING juntos
Primero descartamos a quienes ganan menos de 5000 (WHERE), luego nos quedamos con los departamentos cuyo promedio supera 9000 (HAVING).
sql-group-by.sql
Presiona «ejecutar» para ver el resultado.
05Agrupar por una expresión
Contrataciones por año.
sql-group-by.sql
Presiona «ejecutar» para ver el resultado.
06Agregación condicional (estilo Solemne 2)
Por departamento: cuántos tienen comisión, cuántos no y la diferencia entre ambos, en una sola consulta.
sql-group-by.sql
Presiona «ejecutar» para ver el resultado.
⚠ Errores frecuentes
Seleccionar una columna que no está en el GROUP BY ni dentro de una función de grupo: SQLite lo tolera devolviendo un valor arbitrario, pero Oracle, PostgreSQL y SQL Server lo rechazan. Escríbelo bien siempre.
Filtrar por un agregado en el WHERE en vez de en el HAVING.
Usar HAVING para condiciones de fila (HAVING department_id = 50): funciona, pero es ineficiente; eso va en el WHERE.
Contar con COUNT(CASE WHEN … THEN 1 ELSE 0 END): el 0 también se cuenta. Usa SUM, o COUNT sin ELSE.
2 · Retos con corrección automática
Escribe tu solución y pulsa comprobar (Ctrl + Enter). Tu consulta y la solución se ejecutan
en bases limpias y se comparan los resultados: no importan los nombres de las columnas, sí los datos (y el
orden, cuando el reto lo pide). Si te atascas, usa la pista o mira el resultado esperado.
3 · Preguntas tipo solemne
1. ¿Cuál es el orden lógico correcto de evaluación?
FROM toma las filas, WHERE las filtra, GROUP BY agrupa, HAVING filtra grupos, SELECT proyecta y ORDER BY ordena.
2. Se desea el total de salarios por cargo, solo si supera 100000 (clase 9). ¿Qué cláusula filtra?
La condición es sobre el grupo (un agregado), por eso va en HAVING.
3. ¿Qué cuenta SUM(CASE WHEN salary > 10000 THEN 1 ELSE 0 END)?
Cada fila aporta 1 si cumple la condición y 0 si no: la suma es el conteo de las que cumplen.
4. En la Solemne se pedía «instituciones con menos de 100 matriculados». ¿Qué estructura corresponde?
Se agrupa por institución y se filtran los grupos con HAVING.