60 - Funciones de control de flujo (if)


Problema:
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) unsigned,
  hijos tinyint unsigned,
  primary key(documento)
);

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

4- Es política de la empresa festejar cada fin de mes, los cumpleaños de todos los empleados que 
cumplen ese mes. Si los empleados son de sexo femenino, se les regala un ramo de rosas, si son de 
sexo masculino, una corbata. La secretaria de la Gerencia necesita saber cuántos ramos de rosas y 
cuántas corbatas debe comprar para el mes de mayo:
 select sexo,count(sexo),
  if (sexo='f','rosas','corbata') as 'Obsequio'
  from empleados
  where month(fechanacimiento)=5
  group by sexo;

5- Además, si el empleado cumple 10,20,30,40... años de servicio, se le regala una placa 
recordatoria. La secretaria de Gerencia necesita saber la cantidad de años de servicio que cumplen 
los empleados que ingresaron en el mes de abril para encargar dichas placas:
 select nombre,fechaingreso,
  year(current_date)-year(fechaingreso) as 'Años de servicio',
  if ( (year(current_date)-year(fechaingreso)) %10=0,'Si','No') as 'Placa'
  from empleados
  where month(fechaingreso)=4;

6- La empresa paga un sueldo adicional por hijos a cargos. para un sueldo básico menor o igual a 
$500 el salario familiar por hijo es de $300, para un sueldo superior, el monto es de $150 por 
hijo. Muestre el nombre del empleado, el sueldo básico, la cantidad de hijos a cargo, el valor del 
salario por hijo, el valor total del salario familiar y el sueldo final con el salario familiar 
incluido de todos los empleados con hijos a cargo:
 select nombre,sueldobasico,hijos,
  if (sueldobasico<=500,300,150) as salarioporhijo,
  if (sueldobasico<=500,300*hijos,150*hijos) as salariofamiliar,
  if (sueldobasico<=500,sueldobasico+(300*hijos),sueldobasico+(150*hijos)) as total
  from empleados
  where hijos>0;



 

Otros problemas:
A) La empresa que provee de luz a los usuarios de un municipio, almacena en una tabla algunos datos 
de los usuarios y el monto a cobrar:
- documento,
- domicilio, 
- monto a pagar,
- fecha de vencimiento.
Si la boleta no se paga hasta el día del vencimiento, inclusive, se incrementa al monto, un 1% del 
monto cada día de atraso.

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

2- Cree la tabla:
 create table luz(
  documento char(8) not null,
  domicilio varchar(30),
  monto decimal(5,2) unsigned,
  vencimiento date
);

3- Ingrese algunos registros con fechas de vencimiento anterior a la fecha actual (vencidas) y 
posteriores a la fecha actual (no vencidas).

4- Ingrese para el mismo usuario (igual documento) 2 boletas vencidas.

5- Muestre el documento del usuario, la fecha de vencimiento, la fecha actual (en que efectúa el 
pago) y si debe pagar recargo o no.:
 select documento,vencimiento,
  current_date as 'Fecha actual',
  monto, 
  if (datediff(current_date,vencimiento)>0,'Si','No') as vencida
  from luz;

La función "datediff()" retorna la cantidad de días de diferencia entre las fecha enviadas como 
argumento, si el primer argumento es anterior al segundo, el valor retornado es negativo, por ello, 
colocamos como condición que el valor retornado por esta función sea mayor a cero, es decir, que la 
fecha actual sea posterior a la del vencimiento, así las vencidas mostrarán "Si" y las que no hayan 
vencido "No".

6- Si un usuario tiene más de una boleta vencida se le corta el servicio. Muestre el documento y la 
cantidad de boletas vencidas de cada usuario que tenga boletas vencidas y muestre un 
mensaje "Cortar servicio" si tiene 2 o más vencidas:
 select documento,count(*),
  if (count(*)>1,'Cortar servicio','') as 'aa'
  from luz
  where datediff(current_date,vencimiento)>0
  group by documento;


B) Un profesor guarda los promedios de sus alumnos de un curso en una tabla llamada "alumnos".

1- Elimine la tabla si existe.

2- cree la tabla:
 create table alumnos(
  legajo char(5) not null,
  nombre varchar(30),
  promedio decimal(4,2)
);

3- Ingrese los siguientes registros:
 insert into alumnos values(3456,'Perez Luis',8.5);
 insert into alumnos values(3556,'Garcia Ana',7.0);
 insert into alumnos values(3656,'Ludueña Juan',9.6);
 insert into alumnos values(2756,'Moreno Gabriela',4.8);
 insert into alumnos values(4856,'Morales Hugo',3.2);

4- Si el alumno tiene un promedio superior o igual a 4, muestre un mensaje "aprobado" en caso 
contrario "reprobado":
 select legajo,promedio,
  if (promedio>=4,'aprobado','reprobado')
  from alumnos;

5- Es política del profesor entregar una medalla a quienes tengan un promedio igual o superior a 9. 
Muestre los nombres y promedios de los alumnos y un mensaje "medalla" a quienes cumplan con ese 
requisito:
 select nombre,promedio,
  if (promedio>=9,'medalla','')
  from alumnos;


C) Una playa de estacionamiento guarda cada día los datos de los vehículos que ingresan a la playa 
en una tabla llamada "vehiculos".

1- Elimine la tabla, si existe.

2- Cree la tabla:
 create table vehiculos(
  patente char(6) not null,
  tipo char(4),
  horallegada time not null,
  horasalida time,
  primary key(patente,horallegada)
 );

3- Ingrese algunos registros:
 insert into vehiculos (patente,tipo,horallegada,horasalida)
  values('ACD123','auto','8:30','9:40');
 insert into vehiculos (patente,tipo,horallegada,horasalida)
  values('AKL098','auto','8:45','15:10');
 insert into vehiculos (patente,tipo,horallegada,horasalida)
  values('HGF123','auto','9:30','18:40');
 insert into vehiculos (patente,tipo,horallegada,horasalida)
  values('DRT123','auto','15:30',null);
 insert into vehiculos (patente,tipo,horallegada,horasalida)
  values('FRT545','moto','19:45',null);
 insert into vehiculos (patente,tipo,horallegada,horasalida)
  values('GTY154','auto','20:30','21:00');

4- Muestre la patente, la hora de llegada y de salida de todos los vehículos, más una columna que 
calcule la cantidad de horas que estuvo cada vehículo en la playa, sin considerar los que aún no se 
retiraron de la playa:
 select patente,horallegada,horasalida,
  left(timediff(horasalida,horallegada),5) as horasminutos
  from vehiculos
  where horasalida is not null;

5- Se cobra 1 peso por hora. Pero si un vehículo permanece en la playa 4 horas, se le cobran 3 
pesos, es decir, no se le cobra la cuarta hora; si está 8 horas, se cobran 6 pesos, y así 
sucesivamente. Muestre la patente, la hora de llegada y de salida de todos los vehículos, más la 
columna que calcule la cantidad de horas que estuvo cada vehículo en la playa (sin considerar los 
que aún no se retiraron de la playa) y otra columna utilizando "if" que muestre la cantidad de 
horas gratis:
 select patente,horallegada,horasalida,
  left(timediff(horasalida,horallegada),5) as horasminutos,
  if (hour(timediff(horasalida,horallegada))>4,
  hour(timediff(horasalida,horallegada)) div 4,0) as horagratis
  from vehiculos
  where horasalida is not null;


D) Un teatro con varias salas guarda la información de las entradas vendidas en una tabla 
llamada "entradas".

1- Elimine la tabla, si existe.

2- Cree la tabla:
 create table entradas(
  sala tinyint unsigned,
  fecha date,
  hora time,
  capacidad smallint unsigned,
  entradasvendidas smallint unsigned,
  primary key(sala,fecha,hora)
 );

3- Ingrese algunos registros:
 insert into entradas values(1,'2006-05-10','20:00',300,50);
 insert into entradas values(1,'2006-05-10','23:00',300,250);
 insert into entradas values(2,'2006-05-10','20:00',400,350);
 insert into entradas values(2,'2006-05-11','20:00',400,380);
 insert into entradas values(2,'2006-05-11','23:00',400,400);
 insert into entradas values(3,'2006-05-12','20:00',350,350);
 insert into entradas values(3,'2006-05-12','22:30',350,100);
 insert into entradas values(4,'2006-05-12','20:00',250,0);

4- Muestre todos los registros y un mensaje si las entradas para una función están agotadas:
 select sala,fecha,hora,
  if (capacidad=entradasvendidas,'sala llena',capacidad-entradasvendidas) as 'Entradas disponibles'
  from entradas;

5- Muestre todos los datos de las funciones que tienen vendidad entradas y muestre un mensaje si se 
vendió más o menos de la mitad de la capacidad de la sala:
 select *,
  if (entradasvendidas>(capacidad div 2),'mas de la mitad','menos de la mitad vendidas') as vendidas
  from entradas
  where entradasvendidas>0;

Retornar