54 - Combinaciones y funciones de agrupamiento


Problema:

Una librería almacena la información de sus libros para la venta en dos tablas, "libros" y "editoriales".

Eliminamos ambas tablas y las creamos:

 drop table libros;
 drop table editoriales;

 create table libros(
  codigo number(5),
  titulo varchar2(40),
  autor varchar2(30),
  codigoeditorial number(3),
  precio number(5,2),
  primary key(codigo)
 );

 create table editoriales(
  codigo number(3),
  nombre varchar2(20),
  primary key (codigo)
);

Ingresamos algunos registros en ambas tablas:

 insert into editoriales values(1,'Planeta');
 insert into editoriales values(2,'Emece');
 insert into editoriales values(3,'Siglo XXI');

 insert into libros values(100,'El aleph','Borges',1,20);
 insert into libros values(200,'Martin Fierro','Jose Hernandez',1,30);
 insert into libros values(300,'Aprenda PHP','Mario Molina',3,50);
 insert into libros values(400,'Uno','Richard Bach',3,15);
 insert into libros values(500,'Java en 10 minutos',default,4,45);

Contamos la cantidad de libros de cada editorial consultando ambas tablas:

 select e.nombre as editorial,
  count(*) as cantidad
  from editoriales e
  join libros l
  on codigoeditorial=e.codigo
  group by e.nombre;

Note que las editoriales que no tienen libros no aparecen en la salida porque empleamos un "join".

Buscamos el libro más costoso de cada editorial con un "left join":

 select e.nombre as editorial,
  max(precio) as "mayor precio"
  from editoriales e
  left join libros l
  on codigoeditorial=e.codigo
  group by e.nombre;

La sentencia anterior mostrará, para la editorial de la cual no haya libros, el valor "null" en la columna calculada.

Ingresemos el siguiente lote de comandos en el Oracle SQL Developer:

 drop table libros;
 drop table editoriales;

 create table libros(
  codigo number(5),
  titulo varchar2(40),
  autor varchar2(30),
  codigoeditorial number(3),
  precio number(5,2),
  primary key(codigo)
 );

 create table editoriales(
  codigo number(3),
  nombre varchar2(20),
  primary key (codigo)
 );

 insert into editoriales values(1,'Planeta');
 insert into editoriales values(2,'Emece');
 insert into editoriales values(3,'Siglo XXI');

 insert into libros values(100,'El aleph','Borges',1,20);
 insert into libros values(200,'Martin Fierro','Jose Hernandez',1,30);
 insert into libros values(300,'Aprenda PHP','Mario Molina',3,50);
 insert into libros values(400,'Uno','Richard Bach',3,15);
 insert into libros values(500,'Java en 10 minutos',default,4,45);

 select e.nombre as editorial,
  count(*) as cantidad
  from editoriales e
  join libros l
  on codigoeditorial=e.codigo
  group by e.nombre;

 select e.nombre as editorial,
  max(precio) as "mayor precio"
  from editoriales e
  left join libros l
  on codigoeditorial=e.codigo
  group by e.nombre;

La ejecución de este lote de comandos SQL genera una salida similar a:

SQL Developer combinaciones y funciones de agrupamiento


Retornar