32 - Seleccionar grupos (Having) |
Trabajamos con la tabla "libros" de una librería.
Eliminamos la tabla:
drop table libros;
Creamos la tabla:
create table libros( titulo varchar2(40), autor varchar2(30), editorial varchar2(15), precio number(5,2), cantidad number(3) );
Ingresamos algunos registros:
insert into libros values('El aleph','Borges','Planeta',35,null); insert into libros values('Martin Fierro','Jose Hernandez','Emece',22.20,200); insert into libros values('Martin Fierro','Jose Hernandez','Planeta',40,200); insert into libros values('Antologia poetica','J.L. Borges','Planeta',null,150); insert into libros values('Aprenda PHP','Mario Molina','Emece',18,null); insert into libros values('Manual de PHP', 'J.C. Paez', 'Siglo XXI',56,120); insert into libros values('Cervantes y el quijote','Bioy Casares- J.L. Borges','Paidos',null,100); insert into libros values('Harry Potter y la piedra filosofal','J.K. Rowling',default,45.00,90); insert into libros values('Harry Potter y la camara secreta','J.K. Rowling','Emece',null,100); insert into libros values('Alicia en el pais de las maravillas','Lewis Carroll','Paidos',42,80); insert into libros values('PHP de la A a la Z',null,null,110,0); insert into libros values('Uno','Richard Bach','Planeta',25,null);
Queremos saber la cantidad de libros agrupados por editorial:
select editorial, count(*) from libros group by editorial;
Nos devuelve:
EDITORIAL COUNT(*) ------------------------ Paidos 2 2 Planeta 4 Emece 3 Siglo XXI 1
Queremos saber la cantidad de libros agrupados por editorial pero considerando sólo algunos grupos, por ejemplo, los que devuelvan un valor mayor a 2, usamos la siguiente instrucción:
select editorial, count(*) from libros group by editorial having count(*)>2;
La salida es la siguiente:
EDITORIAL COUNT(*) ------------------------- Planeta 4 Emece 3
Compare esta salida con la de la sentencia anterior.
Queremos el promedio de los precios de los libros agrupados por editorial, pero solamente de aquellos grupos cuyo promedio supere los 25 pesos:
select editorial, avg(precio) from libros group by editorial having avg(precio)>25;
Queremos la cantidad de libros, sin considerar los que tienen precio nulo (where), agrupados por editorial (group by), sin considerar la editorial "Planeta" (having):
select editorial, count(*) from libros where precio is not null group by editorial having editorial<>'Planeta';
Necesitamos el promedio de los precios agrupados por editorial, de aquellas editoriales que tienen más de 2 libros:
select editorial, avg(precio) from libros group by editorial having count(*) > 2;
Buscamos el mayor valor de los libros agrupados y ordenados por editorial y seleccionamos las filas que tienen un valor menor a 100 y mayor a 30:
select editorial, max(precio) as mayor from libros group by editorial having max(precio)<100 and max(precio)>30 order by editorial;
drop table libros; create table libros( titulo varchar2(40), autor varchar2(30), editorial varchar2(15), precio number(5,2), cantidad number(3) ); insert into libros values('El aleph','Borges','Planeta',35,null); insert into libros values('Martin Fierro','Jose Hernandez','Emece',22.20,200); insert into libros values('Martin Fierro','Jose Hernandez','Planeta',40,200); insert into libros values('Antologia poetica','J.L. Borges','Planeta',null,150); insert into libros values('Aprenda PHP','Mario Molina','Emece',18,null); insert into libros values('Manual de PHP', 'J.C. Paez', 'Siglo XXI',56,120); insert into libros values('Cervantes y el quijote','Bioy Casares- J.L. Borges','Paidos',null,100); insert into libros values('Harry Potter y la piedra filosofal','J.K. Rowling',default,45.00,90); insert into libros values('Harry Potter y la camara secreta','J.K. Rowling','Emece',null,100); insert into libros values('Alicia en el pais de las maravillas','Lewis Carroll','Paidos',42,80); insert into libros values('PHP de la A a la Z',null,null,110,0); insert into libros values('Uno','Richard Bach','Planeta',25,null); select editorial, count(*) from libros group by editorial; select editorial, count(*) from libros group by editorial having count(*)>2; select editorial, avg(precio) from libros group by editorial having avg(precio)>25; select editorial, count(*) from libros where precio is not null group by editorial having editorial<>'Planeta'; select editorial, avg(precio) from libros group by editorial having count(*) > 2; select editorial, max(precio) as mayor from libros group by editorial having max(precio)<100 and max(precio)>30 order by editorial;
La ejecución de este lote de comandos SQL genera una salida similar a: