37 - Registros duplicados (distinct)


Problema:
Una academia de enseñanza dicta distintos cursos de informática. Los cursos se dictan por la mañana 
o por la tarde, todos los días de lunes a viernes. La academia guarda los datos de los cursos en 
una tabla llamada "cursos" en la cual almacena el código del curso, el tema, los días de la semana 
que se dicta, el horario, por la mañana (AM) o por la tarde (PM), la cantidad de clases que incluye 
cada curso (clases), la fecha de inicio y el costo del curso.

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

2- Cree la tabla "cursos" con la siguiente estructura:
 create table cursos(
  codigo tinyint unsigned auto_increment,
  tema varchar(20) not null,
  horario char(2) not null,
  clases tinyint unsigned default 10,
  fechainicio date,
  costo decimal(5,2) unsigned,
  primary key(codigo)
 );

3- Ingrese los siguientes registros:
 insert into cursos (tema,horario,clases,fechainicio,costo)
  values('PHP básico','AM',10,'2006-08-07',200);
 insert into cursos (tema,horario,clases,fechainicio,costo)
  values('PHP básico','PM',default,'2006-08-14',200);
 insert into cursos (tema,horario,clases,fechainicio,costo)
  values('PHP básico','AM',default,'2006-08-05',200);
 insert into cursos (tema,horario,clases,fechainicio,costo)
  values('PHP avanzado','AM',20,'2006-08-01',350);
 insert into cursos (tema,horario,clases,fechainicio,costo)
  values('JavaScript básico','PM',15,'2006-09-11',150);
 insert into cursos (tema,horario,clases,fechainicio,costo)
  values('Paginas web','PM',15,'2006-08-08',200);
 insert into cursos (tema,horario,clases,fechainicio,costo)
  values('Paginas web','AM',15,'2006-08-12',200);
 insert into cursos (tema,horario,clases,fechainicio,costo)
  values('Paginas web','AM',15,'2006-08-21',200);
 insert into cursos (tema,horario,clases,fechainicio,costo)
  values('HTML avanzado','AM',20,'2006-09-18',180);
 insert into cursos (tema,horario,clases,fechainicio,costo)
  values('HTML avanzado','PM',20,'2006-09-25',180);
 insert into cursos (tema,horario,clases,fechainicio,costo)
  values('JavaScript avanzado','PM',25,'2006-09-18',150);

4- Obtenga la lista de temas de los cursos sin repetición:
 select distinct tema
  from cursos;

5- Seleccione los cursos donde el tema incluya "PHP", sin repetir horario ni tema:
 select distinct horario,tema from cursos
  where tema like '%PHP%';

6- Cuente la cantidad de cursos DISTINTOS agrupados por horario:
 select horario,count(distinct tema)
  from cursos
  group by horario;



 

Otros problemas:
A) 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- Muestre las distintas provincias y ciudades en las cuales la empresa tiene clientes:
 select distinct provincia,ciudad
  from clientes;

5- Obtenga la cantidad de ciudades distintas, por provincia en las cuales hay clientes:
 select provincia, count(distinct ciudad)
  from clientes
  group by provincia;


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),
  fecha date,
  primary key(numero)
);

3- Ingrese algunos registros:
 insert into visitas (nombre,mail,fecha)
  values ('Ana Maria Lopez','AnaMaria@hotmail.com','2006-10-10');
 insert into visitas (nombre,mail,fecha)
  values ('Gustavo Gonzalez','GustavoGGonzalez@hotmail.com','2006-10-10');
 insert into visitas (nombre,mail,fecha)
  values ('Juancito','JuanJosePerez@hotmail.com','2006-10-11');
 insert into visitas (nombre,mail,fecha)
  values ('Fabiola Martinez','MartinezFabiola@hotmail.com','2006-10-12');
 insert into visitas (nombre,mail,fecha)
  values ('Fabiola Martinez','MartinezFabiola@hotmail.com','2006-09-12');
 insert into visitas (nombre,mail,fecha)
  values ('Juancito','JuanJosePerez@hotmail.com','2006-09-12');
 insert into visitas (nombre,mail,fecha)
  values ('Juancito','JuanJosePerez@hotmail.com','2006-09-15');
 insert into visitas (nombre,mail,fecha)
  values ('Juancito','JuanJosePerez@hotmail.com','2006-09-15');

4- Obtenga los distintos nombres de quienes visitaron la página:
 select distinct nombre
  from visitas;

5- Muestre la cantidad de veces que cada persona ingresó a la página:
 select nombre, count(fecha)
 from visitas
  group by nombre;

6- Muestre la cantidad de veces que cada persona ingresó a la página en distintas fechas:
 select nombre, count(distinct fecha)
 from visitas
  group by nombre;
Note que las dos últimas sentencias tienen una salida diferente. Una persona ingresó 2 veces en el 
mismo día, en el punto Nº6 se cuenta, en el punto Nº 7 no se cuenta porque solicitamos fechas 
diferentes.


C) Una concesionaria de autos vende autos usados y almacena la información en una tabla 
llamada "autos".

1- Elimine la tabla "autos" si existe.

2- Cree la tabla con la siguiente estructura:
 create table autos(
  patente char(6),
  marca varchar(20),
  modelo year,
  precio decimal(8,2) unsigned,
  primary key(patente)
 );

3- Ingrese los siguientes registros:
 insert into autos values('ACD123','Fiat 128','1970',15000);
 insert into autos values('ACG234','Renault 11','1990',40000);
 insert into autos values('BCD333','Peugeot 505','1990',80000);
 insert into autos values('GCD123','Renault 11','1990',70000);
 insert into autos values('BCC333','Renault Megane','1998',95000);
 insert into autos values('BVF543','Fiat 128','1975',20000);
 insert into autos values('FCD123','Renault 11','1995',70000);
 insert into autos values('HCC333','Renault Megane','1995',95000);
 insert into autos values('IVF543','Fiat 128','1970',20000);

4- Muestre las distintas marcas de autos disponibles:
 select distinct marca from autos;

5- Muestre la cantidad de autos por marca, de diferentes modelos:
 select marca, count(distinct modelo)
  from autos
  group by marca;

6- Muestre los distintos modelos de autps disponibles:
 select distinct modelo from autos;


D) Un consultorio médico en el cual trabajan varios médicos registra las consultas de los pacientes 
en una tabla llamada "consultas".

1- Elimine la tabla si existe.

2- Cree la tabla con la siguiente estructura: 
 create table consultas(
  fechayhora datetime not null,
  medico varchar(30) not null,
  documento char(8) not null,
  paciente varchar(30),
  obrasocial varchar(30)
 );

4- Ingrese los siguientes registros:
 insert into consultas values('2006-08-10 8:00','Perez','22333444','Juana Garcia','PAMI');
 insert into consultas values('2006-08-10 10:00','Lopez','22333444','Juana Garcia','PAMI');
 insert into consultas values('2006-08-10 8:30','Perez','23333444','Adela Gomez','PAMI');
 insert into consultas values('2006-08-10 9:00','Perez','24333444','Juan Lopez','IPAM');
 insert into consultas values('2006-08-10 10:00','Perez','25333444','Hector Juarez','OSDOP');
 insert into consultas values('2006-08-10 8:30','Garcia','25333444','Ana Molina','PAMI');
 insert into consultas values('2006-09-10 8:30','Garcia','25333444','Ana Molina','PAMI');

5- Muestre las distintas obras sociales:
 select distinct obrasocial from consultas;

6- Muestre los nombres de los distintos pacientes:
 select distinct paciente from consultas;

7- Muestre la cantidad de distintas obras sociales:
 select distinct obrasocial from consultas;

8- Cuente la cantidad de médicos (SIN REPETIR) que tienen consultas agrupado por mes y día:
 select extract(month from fechayhora),extract(day from fechayhora),
  count(distinct medico) from consultas
  group by extract(month from fechayhora),extract(day from fechayhora);

E) Un club dicta clases de distintos deportes. En una tabla llamada "inscriptos" almacena la 
información necesaria.

1- Elimine la tabla "inscriptos" si existe.

2- Cree la tabla:
 create table inscriptos(
  documento char(8) not null, 
  nombre varchar(30),
  deporte varchar(15) not null,
  año year,
  matricula char(1) default 'N'
 );

3- Ingrese los siguientes registros:
 insert into inscriptos values('35333444','Juan Lopez','tenis','1990','S');
 insert into inscriptos values('35333444','Juan Lopez','basquet','1990','S');
 insert into inscriptos values('35333444','Juan Lopez','natación','1990','S');
 insert into inscriptos values('36333444','Ana Juarez','tenis','1990','S');
 insert into inscriptos values('36333444','Ana Juarez','natación','1990','S');
 insert into inscriptos values('35333444','Juan Lopez','voley','1991','S');
 insert into inscriptos values('35333444','Juan Lopez','voley','1992','S');
 insert into inscriptos values('35333444','Juan Lopez','tenis','1992','S');
 insert into inscriptos values('36333444','Ana Juarez','tenis','1991','S');
 insert into inscriptos values('37333444','Luis Duarte','tenis','1990','S');
 insert into inscriptos values('37333444','Luis Duarte','tenis','1991','S');

4- Muestre los nombres de los inscriptos sin repetir:
 select distinct nombre
 from inscriptos;

5- Muestre los nombres de los deportes sin repetir:
 select distinct deporte
 from inscriptos;

6- Muestre la cantidad de alumnos DISTINTOS inscriptos en cada deporte:
 select deporte,count(distinct nombre)
  from inscriptos
  group by deporte;

7- Muestre la cantidad de inscriptos por año, sin considerar los alumnos que se inscribieron en más 
de un deporte:
 select año,count(distinct nombre)
  from inscriptos
  group by año;

Retornar