54 - Combinaciones y funciones de agrupamiento |
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.
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: