60 - Funciones de control de flujo (if) |
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, 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 ('304154269','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;
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;