61 - Funciones de control de flujo (case)


Problema:
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);
 insert into alumnos values(7856,'Gomez Susana',6.4);

4- Si el alumno tiene un promedio menor a 4, muestre un mensaje "reprobado", si el promedio es 
mayor o igual a 4 y menor a 7, muestre "regular", si el promedio es mayor o igual a 7, 
muestre "promocionado", usando la primer sintaxis de "case":
 select legajo,promedio,
  case truncate(promedio,0)
   when 0 then 'reprobado'
   when 1 then 'reprobado'
   when 2 then 'reprobado'
   when 3 then 'reprobado'
   when 4 then 'regular'
   when 5 then 'regular'
   when 6 then 'regular'
   when 7 then 'promocionado'
   when 8 then 'promocionado'
   when 9 then 'promocionado'
   else 'promocionado'
  end as 'estado'
 from alumnos;

5- Obtenga la misma salida anterior pero empleando la otra sintaxis de "case":
 select legajo,promedio,
  case when promedio<4 then 'reprobado'
       when promedio>4 and promedio<7 then 'regular'
   else 'promocionado'
  end as 'estado'
 from alumnos;



 

Otros problemas:
A) 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- 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 "case" que muestre la cantidad de 
horas gratis:
 select patente,horallegada,horasalida,
  left(timediff(horasalida,horallegada),5) as horasminutos,
  case when hour(timediff(horasalida,horallegada))>4 then 
	    hour(timediff(horasalida,horallegada)) div 4
       else 0
  end as horagratis
  from vehiculos
  where horasalida is not null;

5- 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) y otra columna (con "case") que calcule la cantidad de horas cobradas:
 select patente,horallegada,horasalida,
  left(timediff(horasalida,horallegada),5) as horasminutos,
  case when extract(hour_minute from timediff(horasalida,horallegada))<200 then 1
    else hour(timediff(horasalida,horallegada))-hour(timediff(horasalida,horallegada)) div 4
  end as horascobradas
  from vehiculos
  where horasalida is not null;


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-02-10');
 insert into visitas (nombre,mail,fecha)
  values ('Gustavo Gonzalez','GustavoGGonzalez@hotmail.com','2006-05-10');
 insert into visitas (nombre,mail,fecha)
  values ('Juancito','JuanJosePerez@hotmail.com','2006-06-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- Muestre el nombre, la fecha de ingreso y los nombres de los días de la semana empleando 
un "case": 
 select nombre,fecha,
  case dayname(fecha)
   when 'Monday' then 'lunes'
   when 'Tuesday' then 'martes'
   when 'Wednesday' then 'miercoles'
   when 'Thursday' then 'jueves'
   when 'Friday' then 'viernes'
   when 'Saturday' then 'sabado'
  else 'domingo'
  end as 'dia'
 from visitas;

5- Muestre el nombre y fecha de ingreso a la página y con un "case" muestre si el nombre del mes 
corresponde al 1º, 2º o 3º cuatrimestre del año.
 select nombre,fecha,
  case when (monthname(fecha) in ('January','February','March','April'))
   then '1º cuatrimestre'
  when (monthname(fecha) in ('May','June','July','August'))
   then '2º cuatrimestre'
  else '3º cuatrimestre'
  end as 'mes'
 from visitas;

Retornar