Saltar al contenido

Agregaciones con GROUP BY, y subconsultas.

Un GROUP BY colapsa filas que comparten un valor en común y aplica una función de agregación (COUNT, SUM, AVG, MIN, MAX) a cada grupo. Es como “contar por categoría” en una hoja de cálculo, pero con poder real.

01Las cinco agregaciones

#
COUNT(*)
Cuántas filas hay.
Σ
SUM(col)
Suma todos los valores no nulos.
μ
AVG(col)
Promedio aritmético.
MIN/MAX
El menor o el mayor del grupo.

02Anatomía

SELECT  categoria, COUNT(*) AS cuantos, AVG(precio) AS promedio
FROM    productos
GROUP BY categoria
HAVING  COUNT(*) > 1
ORDER BY promedio DESC;
  • Las columnas que no son agregaciones deben estar en el GROUP BY.
  • HAVING filtra grupos (después de agregar). WHERE filtra filas (antes).
  • AS renombra el resultado — útil para que la columna no se llame COUNT(*).

03Subconsultas — un SELECT dentro de otro

-- Productos más caros que el promedio
SELECT nombre, precio
FROM   productos
WHERE  precio > (SELECT AVG(precio) FROM productos);

El motor evalúa la subconsulta primero (un valor escalar: el promedio) y después la usa como si fuera un número literal. Las subconsultas también pueden aparecer en FROM (tabla derivada) o con IN.

04Laboratorio · agrupa y analiza

~/sql-labpostgres · in-memory
query.sql
SELECT categoria,
       COUNT(*)   AS items,
       AVG(precio) AS promedio,
       MAX(precio) AS maximo
FROM   productos
GROUP BY categoria
ORDER BY promedio DESC;
listo
productos
idINT🔑nombreVARCHAR(60)categoriaVARCHAR(30)precioDECIMAL(10,2)stockINT
1Café SierraCafé3200018
2Café HuilaCafé2800025
3Café TolimaCafé300006
4Té verde1200012
5Té manzanilla950030
6GalletasSnack60004
7ChocolateSnack220008
8AzúcarDespensa450025
9PanelaDespensa320040
10CacaoDespensa1500011
Regla de oro

Si una columna aparece en SELECT pero no es una agregación, tiene que estar en GROUP BY. Si no la pones, te quedas con un valor cualquiera del grupo.

05Desafíos · ponete a prueba

Tres retos de agregación, de menor a mayor dificultad. Escribí tu consulta y dale Comprobar.

Contá cuántos productos hay en cada categoría. Mostrá la columna 'categoria' y la columna 'total' con el conteo. El orden no importa.

Básico

Calculá el stock total disponible por categoría. Mostrá 'categoria' y 'stock_total', ordenados de mayor a menor stock.

Intermedio

Encontrá las categorías cuyo precio promedio supera los 15 000. Mostrá 'categoria' y 'precio_promedio'. El orden no importa.

Avanzado