Al terminar, podrás
- Definir la unidad de una fila antes de agregar.
- Separar filtros de filas y filtros de grupos.
- Comprobar recuentos y sumas con casos pequeños.
Recupera lo aprendido: ¿Dónde pondrías una condición sobre stock individual y otra sobre COUNT(*)?
La idea clave
Una consulta de agregación debe responder tres preguntas: qué filas participan, por qué columna se agrupan y qué cálculo resume cada grupo. WHERE actúa antes del agrupamiento; HAVING, después.
Comprobación rápida: antes de aplicar HAVING, suma los recuentos COUNT(*) de todos los grupos. Debe coincidir con el número de filas que superó WHERE. Si HAVING descarta grupos, esa igualdad ya no tiene por qué cumplirse.
Orden de construcción
SELECT columna_grupo, FUNCION(valor) AS resumen
FROM tabla
WHERE condicion_de_fila
GROUP BY columna_grupo
HAVING condicion_de_grupo;Ejemplo paso a paso
Resumiremos todos los pedidos por estado. No existe filtro previo, así que las 18 filas deben repartirse entre los tres grupos.
SELECT estado,
COUNT(*) AS pedidos,
ROUND(SUM(total), 2) AS total
FROM pedidos
GROUP BY estado
ORDER BY total DESC;| estado | pedidos | total |
|---|---|---|
| enviado | 9 | 1818,70 |
| cancelado | 3 | 1272,90 |
| pendiente | 6 | 840,30 |
Cómo se comprueba
- Los recuentos 9 + 3 + 6 suman las 18 filas de
pedidos. SUM(total)resume el importe dentro de cada estado.ORDER BY total DESCordena el resultado agregado, no las filas originales.
Un error habitual
Filtrar grupos como si fueran filas
SELECT categoria, SUM(stock) AS stock_total
FROM productos
WHERE stock > 0 AND COUNT(*) >= 2
GROUP BY categoria;stock > 0 se comprueba producto a producto, pero COUNT(*) >= 2 necesita un grupo ya formado. Deja el filtro individual en WHERE y mueve el recuento a HAVING.
Practica con datos
Laboratorio SQL
Resuelve la consulta
Suma el stock positivo por categoría. Devuelve categoria y la suma con alias stock_total; conserva categorías con al menos dos productos con stock positivo.
Resultado esperado: 2 filas con categoria, stock_total. El orden de las filas no importa.
Ver tablas y datos
Cargando la estructura del ejercicio…
Distingue productos de unidades: contar productos y sumar su stock son cálculos diferentes.
Filtra stock > 0 antes de agrupar por categoria.
Selecciona SUM(stock) AS stock_total y filtra los grupos con HAVING COUNT(*) >= 2.
Solución
SELECT categoria, SUM(stock) AS stock_total FROM productos WHERE stock > 0 GROUP BY categoria HAVING COUNT(*) >= 2;El orden lógico separa la condición de fila —stock— de la condición de grupo —cantidad de productos—.
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.
Ronda autónoma
Importe no cancelado por cliente
Trabaja solo con pedidos. Devuelve cliente_id, el número de pedidos no cancelados como pedidos y su suma como importe_total. Conserva clientes con al menos dos pedidos válidos y ordena por importe descendente, con cliente_id como desempate.
Ver una orientación
Filtra estados antes de agrupar. Cuenta pedidos dentro de cada grupo y filtra ese recuento después. Todavía no necesitas otra tabla ni nombres de clientes.
Ver la solución explicada
SELECT cliente_id, COUNT(*) AS pedidos,
ROUND(SUM(total), 2) AS importe_total
FROM pedidos
WHERE estado <> 'cancelado'
GROUP BY cliente_id
HAVING COUNT(*) >= 2
ORDER BY importe_total DESC, cliente_id;Obtendrás cinco clientes: 5, 1, 8, 2 y 3, en ese orden. El cliente 5 tiene dos pedidos válidos que suman 1112,00. Cada fila representa un cliente con al menos dos pedidos no cancelados.
Comprueba si puedes explicarlo
En la práctica, ¿por qué se usa COUNT(*) >= 2 y no SUM(stock) >= 2?
Ver respuesta razonada
Se piden al menos dos productos con stock, no dos unidades. WHERE stock > 0 decide qué productos participan; COUNT(*) cuenta esos productos y SUM(stock) suma sus unidades.
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
- Define qué representa una fila del resultado.
- Usa
WHEREpara filas yHAVINGpara grupos. - Comprueba recuentos, nulos y cardinalidad antes de confiar en el resumen.
A continuación: continúa con relaciones y claves.
Fuentes técnicas consultadas
Estas fuentes oficiales respaldan la sintaxis y los matices señalados en la lección.