C:\Resolucion Parcial BD 12.sql create table especializacion ( codespecial smallint primary key, nomespecial nvarchar(30), preciohora money ); create table rubro ( codrubro smallint primary key, nombrerubro nvarchar(40) ); --1. Creación de tablas create table empleado ( cuil bigint primary key, nomempl nvarchar(40), codespecial smallint references especializacion --sólo hace falta el nombre del campo si es diferente en la otra tabla ); create table empleador ( cuit bigint primary key, nomempresa nvarchar(40), codrubro smallint references rubro ); create table trabajo ( codtrabajo smallint primary key, descripcion nvarchar(40), tipo nvarchar(10), cuil bigint references empleado, cuit bigint references empleador ); create table trabajosxfecha ( codtrabajo smallint references trabajo, fechainicio smalldatetime, fechafinaliz smalldatetime, hstrabajadastotales smallint, primary key (codtrabajo, fechainicio) --clave concatenada ); --2. Muestre la cantidad de trabajos que realizó cada empleado select cuil, count(*) from trabajo group by cuil; --3. Indicar el importe total pagado en cada trabajo select trabajo.codtrabajo, sum(preciohora*hstrabajadastotales) from trabajo inner join trabajosxfecha on trabajo.codtrabajo = trabajosxfecha.codtrabajo inner join empleado on trabajo.cuil = empleado.cuil inner join especializacion on empleado.codespecial = especializacion.codespecial group by trabajo.codtrabajo; --en vez de inner join se puede utilizar pareo de tablas select trabajo.codtrabajo, sum(preciohora*hstrabajadastotales) from trabajo, trabajosxfecha, empleado, especializacion where trabajo.codtrabajo = trabajosxfecha.codtrabajo and trabajo.cuil = empleado.cuil and empleado.codespecial = especializacion.codespecial group by trabajo.codtrabajo; --usando alias de tabla select t.codtrabajo, sum(preciohora*hstrabajadastotales) from trabajo t, trabajosxfecha tf, empleado e, especializacion es where t.codtrabajo = tf.codtrabajo and t.cuil = e.cuil and e.codespecial = es.codespecial group by t.codtrabajo; --4. Usando subconsultas muestre los trabajos en que trabajaron 1 C:\Resolucion Parcial BD 12.sql 2 -empleados cuya especialización es electricista select * from trabajo where cuil IN (select cuil from empleado where codespecial = (select codespecial from especializacion where nomespecial = 'Electricista') ); --5. Usando subconsultas muestre los trabajos que corresponden al nombre de rubro “Seguridad” select * from trabajo where cuit IN (select cuit from empleador where codrubro = (select codrubro from rubro where nombrerubro = 'Seguridad') ); --6. Obtener la suma total de hs. Trabajadas por empleado select trabajo.cuil, sum(hstrabajadastotales) from trabajo inner join trabajosxfecha on trabajo.codtrabajo = trabajosxfecha.codtrabajo group by trabajo.cuil; --7. Muestre el Nombre del Empleado, el Nombre del Empleador -para todos los trabajos de tipo “Urgente”. select * from trabajo inner join empleado on trabajo.cuil = empleado.cuil inner join empleador on trabajo.cuit = empleador.cuit where tipo = 'Urgente'; --8. Realice un procedimiento al cual se le pase como parámetro el Cuil del Empleado -y obtenga en una consulta el total general cobrado por el mismo. create procedure sp_cobrado @cuil bigint --alter procedure sp_cobrado @cuil bigint as declare @total money; set @total = 0; begin set @total = (select sum(preciohora*hstrabajadastotales) from trabajosxfecha inner join trabajo on trabajosxfecha.codtrabajo = trabajo.codtrabajo inner join empleado on trabajo.cuil = empleado.cuil inner join especializacion on empleado.codespecial = especializacion. codespecial where trabajo.cuil = @cuil); --debe mostrar sino no se ve el resultado print ('Cobrado: '+cast(@total as varchar)); end; exec sp_cobrado 44444444444; --para comprobar select * from trabajosxfecha inner join trabajo on trabajosxfecha.codtrabajo = trabajo.codtrabajo inner join empleado on trabajo.cuil = empleado.cuil inner join especializacion on empleado.codespecial = especializacion. codespecial where trabajo.cuil = 44444444444; --En ORACLE: create or replace procedure sp_cobrado (cc in number) is total number:=0; begin select sum(preciohora*hstrabajadastotales) into total from trabajosxfecha inner join trabajo on trabajosxfecha.codtrabajo = trabajo.codtrabajo inner join empleado on trabajo.cuil = empleado.cuil inner join especializacion on empleado.codespecial = especializacion. codespecial C:\Resolucion Parcial BD 12.sql where trabajo.cuil = cc; dbms_output.put_line('Cobrado: '||total); end; --9. Realice un procedimiento a la cual se le pase como parámetro la fecha de inicio, -con la misma cargue un cursor con todos los registros de Trabajos por Fechas, -y luego muestre por pantalla los códigos de trabajo y la fecha de finalización de dicho cursor. --En ORACLE: create or replace procedure sp_cursor (fi date) is begin declare cursor cr_trabajos is select * from trabajosxfecha where fechainicio=fi; v_registro cr_trabajos%ROWTYPE; begin open cr_trabajos; loop fetch cr_trabajos into v_registro; exit when cr_trabajos%NOTFOUND; dbms_output.put_line('Código de Trabajo: '||v_registro.codtrabajo); dbms_output.put_line('Fecha de Finalización: '||v_registro.fechafinaliz); dbms_output.put_line(' '); end loop; close cr_trabajos; end; end; --10. Realice un trigger que en el caso de querer ingresar un Empleado con nombre “Juan”, -muestre por pantalla un mensaje que diga “Llamar al supervisor”. --En ORACLE: create or replace trigger tr_juan before insert on empleado for each row when (new.nomempl ='Juan') begin dbms_output.put_line('Debe llamar al supervisor'); end; 3