35 - Agrupar registros (group by)


Hemos aprendido que las funciones de agrupamiento permiten contar registros, calcular sumas y promedios, obtener valores máximos y mínimos. También dijimos que dichas funciones operan sobre conjuntos de registros, no con datos individuales.

Generalmente esta funciones se combinan con la sentencia "group by", que agrupa registros para consultas detalladas.

Queremos saber la cantidad de visitantes de cada ciudad, podemos tipear la siguiente sentencia:

 select count(*) from visitantes
  where ciudad='Cordoba';

y repetirla con cada valor de "ciudad":

 select count(*) from visitantes
  where ciudad='Alta Gracia';
 select count(*) from visitantes
  where ciudad='Villa Dolores';
...

Pero hay otra manera, utilizando la cláusula "group by":

 select ciudad, count(*)
  from visitantes
  group by ciudad;

Entonces, para saber la cantidad de visitantes que tenemos en cada ciudad utilizamos la función "count()", agregamos "group by" y el campo por el que deseamos que se realice el agrupamiento, también colocamos el nombre del campo a recuperar.

La instrucción anterior solicita que muestre el nombre de la ciudad y cuente la cantidad agrupando los registros por el campo "ciudad". Como resultado aparecen los nombres de las ciudades y la cantidad de registros para cada valor del campo.

Para obtener la cantidad visitantes con teléfono no nulo, de cada ciudad utilizamos la función "count()" enviándole como argumento el campo "telefono", agregamos "group by" y el campo por el que deseamos que se realice el agrupamiento (ciudad):

 select ciudad, count(telefono)
  from visitantes
  group by ciudad;

Como resultado aparecen los nombres de las ciudades y la cantidad de registros de cada una, sin contar los que tienen teléfono nulo. Recuerde la diferencia de los valores que retorna la función "count()" cuando enviamos como argumento un asterisco o el nombre de un campo: en el primer caso cuenta todos los registros incluyendo los que tienen valor nulo, en el segundo, los registros en los cuales el campo especificado es no nulo.

Para conocer el total de las compras agrupadas por sexo:

 select sexo, sum(montocompra)
  from visitantes
  group by sexo;

Para saber el máximo y mínimo valor de compra agrupados por sexo:

 select sexo, max(montocompra) from visitantes
  group by sexo;
 select sexo, min(montocompra) from visitantes
  group by sexo;

Se pueden simplificar las 2 sentencias anteriores en una sola sentencia, ya que usan el mismo "group by":

 select sexo, max(montocompra),
  min(montocompra)
  from visitantes
  group by sexo;

Para calcular el promedio del valor de compra agrupados por ciudad:

 select ciudad, avg(montocompra) from visitantes
  group by ciudad;

Podemos agrupar por más de un campo, por ejemplo, vamos a hacerlo por "ciudad" y "sexo":

 select ciudad, sexo, count(*) from visitantes
  group by ciudad,sexo;

También es posible limitar la consulta con "where".

Vamos a contar y agrupar por ciudad sin tener en cuenta "Cordoba":

 select ciudad, count(*) from visitantes
  where ciudad<>'Cordoba'
  group by ciudad;

Podemos usar las palabras claves "asc" y "desc" para una salida ordenada:

 select ciudad, count(*) from visitantes
  group by ciudad desc;

Retornar