31 - Agrupar registros (group by)


Problema:

Trabajamos con la tabla "libros" de una librería.

Eliminamos la tabla:

  drop table libros;

Creamos la tabla:

 create table libros(
  codigo number(5),
  titulo varchar2(40),
  autor varchar2(30) default 'Desconocido',
  editorial varchar2(15),
  precio number(5,2),
  cantidad number(3),
  primary key(codigo)
 );

Ingresamos algunos registros:

 insert into libros
  values(100,'El aleph','Borges','Planeta',15,null);
 insert into libros
  values(234,'Martin Fierro','Jose Hernandez','Emece',22.20,200);
 insert into libros
  values(354,'Antologia poetica',default,'Planeta',null,150);
 insert into libros
  values(478,'Aprenda PHP','Mario Molina','Emece',18.20,null);
 insert into libros
  values(512,'Cervantes y el quijote','Bioy Casares- J.L. Borges','Paidos',28,100);
 insert into libros
  values(643,'Manual de PHP', default, 'Siglo XXI',31.80,120);
 insert into libros
  values(646,'Harry Potter y la piedra filosofal','J.K. Rowling',default,45.00,90);
 insert into libros
  values(753,'Harry Potter y la camara secreta','J.K. Rowling','Emece',null,100);
 insert into libros
  values(889,'Alicia en el pais de las maravillas','Lewis Carroll','Paidos',22.50,200);
 insert into libros
  values(893,'PHP de la A a la Z',null,null,55.90,0);

Queremos saber la cantidad de libros de cada editorial, utilizando la cláusula "group by":

 select editorial, count(*)
  from libros
  group by editorial;

Aparece el siguiente resultado:

EDITORIAL	COUNT(*)
--------------------------
Paidos		2
		2
Planeta		2
Emece		3
Siglo XXI	1

El resultado muestra los nombres de las editoriales y la cantidad de registros para cada valor del campo. Note que los valores nulos se procesan como otro grupo.

Obtenemos la cantidad libros con precio no nulo de cada editorial:

 select editorial, count(precio)
  from libros
  group by editorial;

La salida es la siguiente:

EDITORIAL	COUNT(PRECIO)
------------------------------
Paidos		2
		2
Planeta		1
Emece		2
Siglo XXI	1

Aparecen los nombres de las editoriales y la cantidad de registros de cada una, sin contar los que tienen precio nulo.

Para conocer el total de libros agrupados por editorial, tipeamos:

 select editorial, sum(cantidad)
  from libros
  group by editorial;

Obtenemos el máximo y mínimo valor de los libros agrupados por editorial, en una sola sentencia:

 select editorial,
  max(precio) as mayor,
  min(precio) as menor
  from libros
  group by editorial;

Calculamos el promedio del valor de los libros agrupados por editorial:

 select editorial, avg(precio)
  from libros
  group by editorial;

Es posible limitar la consulta con "where". Vamos a contar y agrupar por editorial considerando solamente los libros cuyo precio es menor a 30 pesos:

 select editorial, count(*)
  from libros
  where precio<30
  group by editorial;

Note que las editoriales que no tienen libros que cumplan la condición (sus precios superan los 30 pesos), no aparecen en la salida.


Retornar