69 - join, group by y funciones de agrupamiento. |
Una empresa tiene registrados sus clientes en una tabla llamada "clientes", también tiene una tabla "provincias" donde registra los nombres de las provincias de las cuales son oriundos los clientes. 1- Elimine la tabla "clientes" y "provincias", si existen: drop table if exists clientes, provincias; 2- Créelas con las siguientes estructuras: create table clientes ( codigo int unsigned auto_increment, nombre varchar(30) not null, domicilio varchar(30), ciudad varchar(20), codigoprovincia tinyint unsigned, telefono varchar(11), primary key(codigo) ); create table provincias( codigo tinyint unsigned auto_increment, nombre varchar(20), primary key (codigo) ); 3- Ingrese algunos registros para ambas tablas: insert into provincias (nombre) values('Cordoba'); insert into provincias (nombre) values('Santa Fe'); insert into provincias (nombre) values('Corrientes'); insert into provincias (nombre) values('Misiones'); insert into provincias (nombre) values('Salta'); insert into provincias (nombre) values('Buenos Aires'); insert into provincias (nombre) values('Neuquen'); insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono) values ('Lopez Marcos', 'Colon 111', 'Córdoba',1,'null'); insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono) values ('Perez Ana', 'San Martin 222', 'Cruz del Eje',1,'4578585'); insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono) values ('Garcia Juan', 'Rivadavia 333', 'Villa Maria',1,'4578445'); insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono) values ('Perez Luis', 'Sarmiento 444', 'Rosario',2,null); insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono) values ('Pereyra Lucas', 'San Martin 555', 'Cruz del Eje',1,'4253685'); insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono) values ('Gomez Ines', 'San Martin 666', 'Santa Fe',2,'0345252525'); insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono) values ('Torres Fabiola', 'Alem 777', 'Villa del Rosario',1,'4554455'); insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono) values ('Lopez Carlos', 'Irigoyen 888', 'Cruz del Eje',1,null); insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono) values ('Ramos Betina', 'San Martin 999', 'Cordoba',1,'4223366'); insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono) values ('Lopez Lucas', 'San Martin 1010', 'Posadas',4,'0457858745'); 4- Agrupe por nombre de provincia y cuente la cantidad de clientes por provincia usando un "join": select p.nombre, count(c.codigoprovincia) as 'cant. clientes' from provincias as p join clientes as c on p.codigo=c.codigoprovincia group by p.nombre; sólo aparecen las provincias en las cuales tenemos clientes. 5- Agrupe por nombre de provincia y cuente la cantidad de clientes por provincia usando un "left join": select p.nombre, count(c.codigoprovincia) as 'cant. clientes' from provincias as p left join clientes as c on p.codigo=c.codigoprovincia group by p.nombre; Muestra todas las provincias. 6- Agrupe por nombre de provincia y muestre la cantidad de clientes por provincia usando un "join" de las provincias en las cuales tenemos 2 o más clientes: select p.nombre, count(c.codigoprovincia) as 'cant. clientes' from provincias as p join clientes as c on p.codigo=c.codigoprovincia group by p.nombre having count(c.codigoprovincia)>=2;
A) Un comercio que tiene un stand en una feria registra en una tabla llamada "visitantes" algunos datos de las personas que visitan o compran en su stand para luego enviarle publicidad de sus productos. 1- Elimine las tablas "visitantes" y "ciudades", si existen. 2- Créelas con las siguientes estructuras: create table visitantes( nombre varchar(30), edad tinyint unsigned, sexo char(1), domicilio varchar(30), codigociudad tinyint unsigned not null, telefono varchar(11), montocompra decimal(6,2) unsigned ); create table ciudades( codigo tinyint unsigned auto_increment, nombre varchar(20), primary key (codigo) ); 3- Ingrese algunos registros: insert into ciudades (nombre) values('Cordoba'); insert into ciudades (nombre) values('Alta Gracia'); insert into ciudades (nombre) values('Villa Dolores'); insert into ciudades (nombre) values('Carlos Paz'); insert into visitantes (nombre,edad, sexo,domicilio,codigociudad,telefono,montocompra) values ('Susana Molina', 28,'f','Colon 123',1,null,45.50); insert into visitantes (nombre,edad, sexo,domicilio,codigociudad,telefono,montocompra) values ('Marcela Mercado',36,'f','Avellaneda 345',1,'4545454',0); insert into visitantes (nombre,edad, sexo,domicilio,codigociudad,telefono,montocompra) values ('Alberto Garcia',35,'m','Gral. Paz 123',2,'03547123456',25); insert into visitantes (nombre,edad, sexo,domicilio,codigociudad,telefono,montocompra) values ('Teresa Garcia',33,'f','Gral. Paz 123',2,'03547123456',0); insert into visitantes (nombre,edad, sexo,domicilio,codigociudad,telefono,montocompra) values ('Roberto Perez',45,'m','Urquiza 335',1,'4123456',33.20); insert into visitantes (nombre,edad, sexo,domicilio,codigociudad,telefono,montocompra) values ('Marina Torres',22,'f','Colon 222',3,'03544112233',25); insert into visitantes (nombre,edad, sexo,domicilio,codigociudad,telefono,montocompra) values ('Julieta Gomez',24,'f','San Martin 333',2,'03547121212',53.50); insert into visitantes (nombre,edad, sexo,domicilio,codigociudad,telefono,montocompra) values ('Roxana Lopez',20,'f','Triunvirato 345',2,null,0); insert into visitantes (nombre,edad, sexo,domicilio,codigociudad,telefono,montocompra) values ('Liliana Garcia',50,'f','Paso 999',1,'4588778',48); insert into visitantes (nombre,edad, sexo,domicilio,codigociudad,telefono,montocompra) values ('Juan Torres',43,'m','Sarmiento 876',1,'4988778',15.30); 4- Muestre la cantidad de visitantes agrupados por nombre de la ciudad: select c.nombre,count(v.codigociudad) from ciudades as c left join visitantes as v on c.codigo=v.codigociudad group by c.nombre; 5- Muestre la cantidad de visitantes que hicieron alguna compra, agrupados por nombre de la ciudad: select c.nombre,count(v.codigociudad) from ciudades as c join visitantes as v on c.codigo=v.codigociudad where v.montocompra>0 group by c.nombre; 6- Muestre la suma de las compras y el promedio de las mismas, agrupados por ciudad y sexo: select c.nombre,sexo,sum(montocompra) as 'total', avg(montocompra) as 'promedio' from ciudades as c join visitantes as v on c.codigo=v.codigociudad group by c.nombre,sexo; B) Una inmobiliaria que alquila departamentos guarda la información de los mismos en una tabla llamada "departamentos" y "barrios". 1- Elimine las tablas si existen. 2- Cree las tablas con las siguientes estructuras: create table inmuebles( edificio varchar(30), domicilio varchar(30) not null, piso char(1) not null, numerodpto char(2) not null, detalles varchar(200), codigobarrio tinyint unsigned, precio decimal(6,2) unsigned, primary key (edificio,piso,numerodpto) ); create table barrios( codigo tinyint unsigned auto_increment, nombre varchar(30), primary key(codigo) ); 3- Ingrese los siguientes registros: insert into barrios (nombre) values ('Centro'); insert into barrios (nombre) values ('Alberdi'); insert into barrios (nombre) values ('Gral. Paz'); insert into barrios (nombre) values ('Pueyrredon'); insert into departamentos (edificio,domicilio,piso,numerodpto,codigobarrio,precio) values('Avellaneda','Avellaneda 86','1','1',1,400.50); insert into departamentos (edificio,domicilio,piso,numerodpto,codigobarrio,precio) values('Avellaneda','Avellaneda 86','1','2',1,400.50); insert into departamentos (edificio,domicilio,piso,numerodpto,codigobarrio,precio) values('Avellaneda','Avellaneda 86','2','1',1,400.50); insert into departamentos (edificio,domicilio,piso,numerodpto,codigobarrio,precio) values('Bolivar','Sarmiento 1203','1','1',3,500); insert into departamentos (edificio,domicilio,piso,numerodpto,codigobarrio,precio) values('Centauro I','Peru 456','1','A',4,300); insert into departamentos (edificio,domicilio,piso,numerodpto,codigobarrio,precio) values('Centauro I','Peru 456','2','C',4,350); insert into departamentos (edificio,domicilio,piso,numerodpto,codigobarrio,precio) values('Paris','Urquiza 364','1','12',1,600); 4- Muestre todos los departamentos incluido el nombre del barrio: select edificio,domicilio,piso,numerodpto,nombre,precio from departamentos as d join barrios as b on d.codigobarrio=b.codigo; 5- Muestre la cantidad de departamentos por edificio con el nombre del barrio: select edificio,nombre,count(*) from departamentos as d join barrios as b on d.codigobarrio=b.codigo group by edificio; 6- Muestre el promedio de los precios de los departamentos agrupados por barrio: select nombre,avg(precio) from departamentos as d join barrios as b on d.codigobarrio=b.codigo group by nombre; 7- Muestre el promedio de los precios de los departamentos agrupados por barrio teniendo en cuenta todos los barrios, incluso aquellos en los cuales no hay departamentos disponibles: select nombre,avg(precio) from barrios as b left join departamentos as d on d.codigobarrio=b.codigo group by nombre; C) Un video club que alquila películas en video guarda información de sus películas en alquiler y los alquileres en las tabla "peliculas" y "alquileres" respectivamente. 1- Elimine las tablas si existen. 2- Créelas con las siguientes estructuras: create table peliculas ( codigo smallint unsigned auto_increment, titulo varchar(30) not null, actores varchar(40), duracion tinyint unsigned, primary key (codigo) ); create table alquileres( codigopelicula smallint unsigned not null, socio varchar(30) not null, fechaprestamo date not null, fechadevolucion date, primary key (codigopelicula,fechaprestamo) ); 3- Ingrese los siguientes registros para las 2 tablas. insert into peliculas (titulo,actores,duracion) values('Elsa y Fred','China Zorrilla',90); insert into peliculas (titulo,actores,duracion) values('Mision imposible','Tom Cruise',120); insert into peliculas (titulo,actores,duracion) values('Mision imposible 2','Tom Cruise',180); insert into peliculas (titulo,actores,duracion) values('Harry Potter y la piedra filosofal','Daniel H.',120); insert into peliculas (titulo,actores,duracion) values('Harry Potter y la camara secreta','Daniel H.',150); insert into alquileres (codigopelicula,socio,fechaprestamo) values(1,'Juan Lopez','2006-07-02'); insert into alquileres (codigopelicula,socio,fechaprestamo) values(2,'Juan Lopez','2006-07-02'); insert into alquileres (codigopelicula,socio,fechaprestamo) values(3,'Juan Lopez','2006-07-12'); insert into alquileres (codigopelicula,socio,fechaprestamo) values(1,'Luis Molina','2006-08-02'); insert into alquileres (codigopelicula,socio,fechaprestamo) values(3,'Luis Molina','2006-08-12'); insert into alquileres (codigopelicula,socio,fechaprestamo) values(4,'Luis Molina','2006-08-02'); insert into alquileres (codigopelicula,socio,fechaprestamo) values(1,'Andrea Torres','2006-09-02'); insert into alquileres (codigopelicula,socio,fechaprestamo) values(2,'Andrea Torres','2006-08-02'); insert into alquileres (codigopelicula,socio,fechaprestamo) values(3,'Andrea Torres','2006-08-15'); insert into alquileres (codigopelicula,socio,fechaprestamo) values(4,'Andrea Torres','2006-08-22'); insert into alquileres (codigopelicula,socio,fechaprestamo) values(4,'Juan Lopez','2006-08-25'); insert into alquileres (codigopelicula,socio,fechaprestamo) values(1,'Andrea Torres','2006-08-25'); 4- Muestre toda la información de los "alquileres" (nombre de la película, nombre del socio, fecha de préstamo y de devolución): select titulo,socio,fechaprestamo,fechadevolucion from alquileres as a join peliculas as p on a.codigopelicula=p.codigo 5- Muestre la cantidad de veces que se alquiló cada película: select p.titulo,count(*) from peliculas as p join alquileres as a on p.codigo=a.codigopelicula group by p.titulo; 6- Muestre la cantidad de películas que alquiló cada socio: select socio,count(a.codigopelicula) from alquileres group by socio; 7- Muestre la cantidad de películas DISTINTAS que alquiló cada socio: select socio,count(distinct a.codigopelicula) from alquileres group by socio; 8- Muestre la cantidad de películas alquiladas por mes por cada socio ordenado por mes: select socio, monthname(a.fechaprestamo) as mes, count(a.codigopelicula) from alquileres group by socio, mes order by mes;