SkillGridAprende informática practicando

COUNT, SUM, AVG y GROUP BY: juntar filas con honestidad

Convierte muchas filas en unos pocos números, agrúpalas por artículo y descubre cómo un promedio puede esconder justo lo que necesitas saber.

14 min · 45 XP

Filtrar reduce una tabla, pero algunas preguntas necesitan lo contrario: juntar muchas filas en un solo número. ¿Cuánto ganó hoy la cafetería? ¿Cuántos pedidos hubo? No puedes responder eso mostrando filas: necesitas funciones de agregación, y ya conoces la idea: esto es agregar sobre un conjunto, el mismo movimiento que hiciste en el módulo de lógica, ahora sobre una tabla de verdad.

SELECT COUNT(*) FROM sales

4 rows in, 1 row out

SELECT SUM(count) FROM sales

40 + 55 + 23 + 60 = 178Vuelve una sola fila, sin importar cuántas filas entraron.

Las cuatro funciones que vas a usar todo el tiempo: COUNT cuenta filas (o valores), SUM las suma, AVG da el promedio, y MAX y MIN devuelven el mayor y el menor. Cada una recibe muchos valores y devuelve exactamente uno. COUNT(*) cuenta las filas tal como están; COUNT(paid) cuenta solo las filas donde paid no es NULL: esa diferencia muchas veces es justamente la historia.

La cafetería quiere un número por platillo: cuántas unidades vendió en total de cada uno. Sin agrupar tendrías que escribir cuatro consultas separadas con WHERE item = 'soup', WHERE item = 'juice' y así sucesivamente. GROUP BY hace todo eso en una sola consulta y garantiza que cada platillo tenga exactamente una fila.

SELECT item, SUM(count)
FROM   sales
GROUP  BY item

+---------+------------+
| item    | SUM(count) |
+---------+------------+
| soup    | 40         |
| juice   | 75         |
| salad   | 23         |
| sandwich| 55         |
+---------+------------+Una fila por item: cada grupo se junta en su total.

Así funciona por dentro. Las cuatro filas caen en cuatro grupos según su valor de item. Dentro de cada grupo, SUM(count) suma los count. El resultado tiene una fila por grupo, no por fila original. De ahí sale qué columnas pueden aparecer junto a la función de agregación en SELECT: solo las que tienen un único valor dentro del grupo.

SELECT item, price, SUM(count)
FROM   sales
GROUP  BY item

item    -> one value per group
SUM(count) -> one value per group
price   -> many values per group, no single answerPor qué mezclar columnas agrupadas y no agrupadas no tiene respuesta.

Ahora viene la trampa más sutil, y no necesita ningún SQL mal escrito. La cafetería mide la cola en minutos. Dos días, y los promedios son casi iguales. ¿El promedio de 3.2 y el promedio de 3.4 te dicen que esos días fueron parecidos?

queue times in minutes for two days

monday:  1, 1, 1, 1, 12      AVG = 3.2
tuesday: 2, 3, 3, 4, 5       AVG = 3.4

same average, different daysEl mismo promedio construido a partir de dos días muy distintos.

El lunes fue tranquilo: cuatro alumnos esperaron un minuto y uno con mala suerte esperó doce. El martes todos esperaron una cantidad pareja y moderada. Los promedios coinciden, pero los días no tienen nada en común. Un promedio es un solo número haciendo el trabajo de toda una distribución, y por sí solo no puede decir si los doces son raros o normales.

Práctica

  1. Escribe una consulta que muestre cada artículo con el total de unidades vendidas. La tabla sales tiene las columnas item, price y count.

    Pistas
    • La respuesta debe tener una fila por artículo, y GROUP BY es lo que produce una fila por grupo.
    • Dentro de cada grupo necesitas el total de count, que es SUM(count).
    • El orden es: lo que conservas y cómo lo resúmenes en SELECT, la tabla en FROM, la agrupación en GROUP BY.
  2. Un compañero de clase escribe: SELECT item, price, SUM(count) FROM sales GROUP BY item. ¿Por qué la base de datos rechaza esta consulta?

    Pistas
    • Para cada columna del SELECT pregúntate: ¿esta columna tiene exactamente un valor dentro de un grupo?
    • item es el grupo en sí, price es un número distinto en filas distintas del mismo grupo.
  3. La cafetería ve que el promedio de la cola ayer fue de 10 minutos. ¿Qué es lo más útil que conviene revisar antes de sacar una conclusión?

    Pistas
    • Un promedio de 10 puede salir de 10 y 10, o de 1 y 19. ¿En cuál de las dos filas preferirías esperar?
    • La cafetería no necesita la lista exacta para actuar: necesita saber si las esperas largas son raras o normales.