36 - Selección de un grupo de registros (having)


Problema:
Una empresa tiene registrados sus clientes en una tabla llamada "clientes".

1- Elimine la tabla "clientes", si existe.

2- Créela con la siguiente estructura:
 create table clientes (
  codigo int unsigned auto_increment,
  nombre varchar(30) not null,
  domicilio varchar(30),
  ciudad varchar(20),
  provincia varchar (20),
  telefono varchar(11),
  primary key(codigo)
);

3- Ingrese algunos registros:
 insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
  values ('Lopez Marcos', 'Colon 111', 'Córdoba','Cordoba','null');
 insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
  values ('Perez Ana', 'San Martin 222', 'Cruz del Eje','Cordoba','4578585');
 insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
  values ('Garcia Juan', 'Rivadavia 333', 'Villa Maria','Cordoba','4578445');
 insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
  values ('Perez Luis', 'Sarmiento 444', 'Rosario','Santa Fe',null);
 insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
  values ('Pereyra Lucas', 'San Martin 555', 'Cruz del Eje','Cordoba','4253685');
 insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
  values ('Gomez Ines', 'San Martin 666', 'Santa Fe','Santa Fe','0345252525');
 insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
  values ('Torres Fabiola', 'Alem 777', 'Villa del Rosario','Cordoba','4554455');
 insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
  values ('Lopez Carlos', 'Irigoyen 888', 'Cruz del Eje','Cordoba',null);
 insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
  values ('Ramos Betina', 'San Martin 999', 'Cordoba','Cordoba','4223366');
 insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
  values ('Lopez Lucas', 'San Martin 1010', 'Posadas','Misiones','0457858745');

4- Obtenga el total de los registros agrupados por provincia:
 select provincia, count(*)
  from clientes
  group by provincia;

5- Obtenga el total de los registros agrupados por ciudad y provincia:
 select ciudad, provincia, count(*)
  from clientes
  group by ciudad,provincia;

6- Obtenga el total de los registros agrupados por ciudad y provincia sin considerar los que tienen 
menos de 2 clientes:
 select ciudad, provincia, count(*)
  from clientes
  group by ciudad,provincia
  having count(*)>1;

7- Obtenga el total de los registros sin teléfono nulo, agrupados por ciudad y provincia sin 
considerar los que tienen menos de 2 clientes:
 select ciudad, provincia, count(*)
  from clientes
  where telefono is not null
  group by ciudad,provincia
  having count(*)>1;



 

Otros problemas:
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 la tabla "visitantes", si existe.

2- Créela con la siguiente estructura:
 create table visitantes(
  nombre varchar(30),
  edad tinyint unsigned,
  sexo char(1),
  domicilio varchar(30),
  ciudad varchar(20),
  telefono varchar(11),
  montocompra decimal(6,2)
 );

3- Ingrese algunos registros:
 insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra)
  values ('Susana Molina', 28,'f','Colon 123','Cordoba',null,45.50); 
 insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra)
  values ('Marcela Mercado',36,'f','Avellaneda 345','Cordoba','4545454',0);
 insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra)
  values ('Alberto Garcia',35,'m','Gral. Paz 123','Alta Gracia','03547123456',25); 
 insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra)
  values ('Teresa Garcia',33,'f','Gral. Paz 123','Alta Gracia','03547123456',0);
 insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra)
  values ('Roberto Perez',45,'m','Urquiza 335','Cordoba','4123456',33.20);
 insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra)
  values ('Marina Torres',22,'f','Colon 222','Villa Dolores','03544112233',25);
 insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra)
  values ('Julieta Gomez',24,'f','San Martin 333','Alta Gracia','03547121212',53.50);
 insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra)
  values ('Roxana Lopez',20,'f','Triunvirato 345','Alta Gracia',null,0);
 insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra)
  values ('Liliana Garcia',50,'f','Paso 999','Cordoba','4588778',48);
 insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra)
  values ('Juan Torres',43,'m','Sarmiento 876','Cordoba','4988778',15.30);

4- Obtenga el total de las compras agrupados por ciudad y sexo:
 select ciudad, sexo, sum(montocompra)
  from visitantes
  group by ciudad, sexo;

5- Obtenga el total de las compras agrupados por ciudad y sexo, considerando sólo las sumas 
superiores a 50 pesos:
 select ciudad, sexo, sum(montocompra)
  from visitantes
  group by ciudad, sexo
  having sum(montocompra)>50;

6- Muestre el monto mayor de compra agrupado por ciudad, siempre que el valor supere los 30 pesos, 
considerando sólo los visitantes con telefono no nulo:
 select ciudad, max(montocompra)
  from visitantes
  where telefono is not null
  group by ciudad
  having max(montocompra)>30;

7- Agrupe por ciudad y muestre para cada grupo (ciudad) el total de visitantes, la suma de sus 
compras y el promedio de compras: 
 select ciudad, count(*), sum(montocompra),avg(montocompra)
  from visitantes
  group by ciudad;


B) En una página web se solicitan los siguientes datos para guardar información de sus visitas.

1- Elimine la tabla "visitas", si existe.

2- Créela con la siguiente estructura:
 create table visitas (
  numero int unsigned auto_increment,
  nombre varchar(30) not null,
  mail varchar(50),
  pais varchar (20),
  puntaje tinyint unsigned,
  primary key(numero)
);
El puntaje va de 0 a 10.

3- Ingrese algunos registros:
 insert into visitas (nombre,mail,pais,puntaje)
  values ('Ana Maria Lopez','AnaMaria@hotmail.com','Argentina',9);
 insert into visitas (nombre,mail,pais,puntaje)
  values ('Gustavo Gonzalez','GustavoGGonzalez@yahoo.com','Chile',8);
 insert into visitas (nombre,mail,pais,puntaje)
  values ('Juancito','JuanJosePerez@hotmail.com','Mexico',5);
 insert into visitas (nombre,mail,pais,puntaje)
  values ('Fabiola Martinez','MartinezFabiolaM@hotmail.com','Chile',9);
 insert into visitas (nombre,mail,pais,puntaje)
  values ('Fabiola Martinez',null,'Peru',8);
 insert into visitas (nombre,mail,pais,puntaje)
  values ('Mariana Torres','MarianitaTorres','Peru',7);

4- Muestre el promedio de los puntajes agrupados por pais, considerando sólo aquellos países que 
tiene más de 1 visita:
 select pais, avg(puntaje) from visitas
 group by pais
 having count(*)>=2;

5- Muestre el promedio de los puntajes agrupados por pais, considerando sólo aquellos países cuyo 
promedio es mayor a 8:
 select pais, avg(puntaje) from visitas
 group by pais
 having avg(puntaje)>8;


C) Una empresa registra los datos de sus empleados en una tabla llamada "empleados".

1- Elimine la tabla "empleados" si existe:
 drop table if exists empleados;

2- Cree la tabla:
 create table empleados(
  documento char(8) not null,
  nombre varchar(30) not null,
  sexo char(1),
  domicilio varchar(30),
  fechaIngreso date,
  fechaNacimiento date,
  sueldoBasico decimal(5,2),
  primary key(documento)
 );

3- Ingrese algunos registros:
 insert into empleados (documento,nombre,sexo,domicilio,fechaingreso,fechanacimiento,sueldobasico)
  values ('22333111','Juan Perez','m','Colon 123','1990-02-01','1970-05-10',550);
 insert into empleados (documento,nombre,sexo,domicilio,fechaingreso,fechanacimiento,sueldobasico)
  values ('25444444','Susana Morales','f','Avellaneda 345','1995-04-01','1975-11-06',650);
 insert into empleados (documento,nombre,sexo,domicilio,fechaingreso,fechanacimiento,sueldobasico)
  values ('20111222','Hector Pereyra','m','Caseros 987','1995-04-01','1965-03-25',510);
 insert into empleados (documento,nombre,sexo,domicilio,fechaingreso,fechanacimiento,sueldobasico)
  values ('30000222','Luis LUque','m','Urquiza 456','1980-09-01','1980-03-29',700);
 insert into empleados (documento,nombre,sexo,domicilio,fechaingreso,fechanacimiento,sueldobasico)
  values ('20555444','Maria Laura Torres','f','San Martin 1122','2000-05-15','1965-12-22',700);
 insert into empleados (documento,nombre,sexo,domicilio,fechaingreso,fechanacimiento,sueldobasico)
  values ('30000234','Alberto Soto','m','Peru 232','2003-08-15','1989-10-10',420);
 insert into empleados (documento,nombre,sexo,domicilio,fechaingreso,fechanacimiento,sueldobasico)
  values ('20125478','Ana Gomez','f','Sarmiento 975','2004-06-14','1976-09-21',350);
 insert into empleados (documento,nombre,sexo,domicilio,fechaingreso,fechanacimiento,sueldobasico)
  values ('24154269','Ofelia Garcia','f','Triunvirato 628','2004-09-23','1974-05-12',390);

4- La empresa festeja cada mes los cumpleaños de todos los empleados que cumplen ese mes. Queremos 
saber cuántos empleados cumplen años en los meses de agosto a diciembre:
 select month(fechanacimiento) as mes,
  count(*) as cantidad
  from empleados
  group by mes
  having mes>=8;

5- Se necesita conocer la cantidad de empleados agrupados por fecha de ingreso a la empresa sólo de 
las fechas posteriores a "1990-02-01":
 select fechaingreso,count(*)
  from empleados
  group by fechaingreso
  having fechaingreso>'1990-02-01';

Retornar