Un agregado por grupo
Casi nunca queremos un solo número para toda la tabla, sino uno por
categoría, por cliente, por mes.... Para eso está GROUP BY: divide las filas
en grupos según los valores de una columna y aplica la función agregada a
cada grupo por separado.
SELECT categoria, AVG(precio) AS precio_medio
FROM productos
GROUP BY categoria;
Esto devuelve una fila por cada categoría distinta, con el precio medio de los productos de esa categoría.
Qué puede ir en el SELECT
Esta es la regla de oro: cuando hay GROUP BY, en el SELECT solo pueden
aparecer:
- Las columnas por las que agrupas (las que están en el
GROUP BY). - Funciones agregadas (
COUNT,SUM,AVG...).
Poner una columna "normal" que no esté en el GROUP BY no tiene sentido: el
grupo tiene muchas filas y ese campo puede valer cosas distintas en cada una.
-- Productos y stock total por categoria, de mayor a menor stock
SELECT categoria, SUM(stock) AS stock_total
FROM productos
GROUP BY categoria
ORDER BY stock_total DESC;
ORDER BYse aplica después de agrupar, así que puedes ordenar por el propio agregado (por su alias o repitiendo la función).