8) Crear un procedimiento que recupere el número departamento, el nombre y número de empleados, dándole como valor el nombre del departamento, si el nombre introducido no es válido, mostraremos un mensaje informativo comunicándolo.
CREATE PROCEDURE DEPARTAMENTO @DEPT NVARCHAR(30) AS DECLARE @DEPTDEF NVARCHAR(30) SET @DEPTDEF = NULL SELECT @DEPTDEF = DNOMBRE FROM DEPT WHERE DNOMBRE = @DEPT IF (@DEPTDEF IS NULL) PRINT 'DEPARTAMENTO INTRODUCIDO NO VALIDO: ' + @DEPT ELSE BEGIN SELECT E.DEPT_NO AS [NUMERO DEPT] , D.DNOMBRE AS [NOMBRE], COUNT(*) AS [NUMERO EMPLEADOS] FROM EMP AS E INNER JOIN DEPT AS D ON E.DEPT_NO = D.DEPT_NO WHERE D.DNOMBRE = @DEPT GROUP BY D.DNOMBRE, E.DEPT_NO END
EXEC DEPARTAMENTO 'VENTAS'
9) Crear un procedimiento para devolver un informe sobre los empleados de la plantilla de un determinado hospital, sala, turno o función. El informe mostrará número de empleados, media, suma y un informe personalizado de cada uno que muestre número de empleado, apellido y salario.
CREATE PROCEDURE EMPPLANTILLA @VALOR NVARCHAR(30) AS DECLARE @CONSULTA NVARCHAR(30) SELECT @CONSULTA = NOMBRE FROM HOSPITAL WHERE NOMBRE = @VALOR IF (@CONSULTA IS NULL) BEGIN SELECT @CONSULTA = NOMBRE FROM SALA WHERE NOMBRE = @VALOR IF (@CONSULTA IS NULL) BEGIN SELECT @CONSULTA = T FROM PLANTILLA WHERE T = @VALOR IF (@CONSULTA IS NULL) BEGIN SELECT @CONSULTA = FUNCION FROM PLANTILLA WHERE FUNCION = @VALOR IF (@CONSULTA IS NULL) BEGIN PRINT 'EL VALOR INTRODUCIDO NO ES UN HOSPITAL, SALA, TURNO O FUNCIÓN: ' + @VALOR PRINT 'VERIFIQUE LOS DATOS INTRODUCIDOS' END ELSE BEGIN PRINT 'FUNCION' SELECT FUNCION AS [TURNO] ,AVG(SALARIO) AS [MEDIA] ,COUNT(EMPLEADO_NO) AS [Nº EMPLEADOS] ,SUM(SALARIO) AS [SUMA] FROM PLANTILLA GROUP BY FUNCION HAVING FUNCION = @VALOR SELECT EMPLEADO_NO AS [Nº EMPLEADO] ,APELLIDO, SALARIO, FUNCION FROM PLANTILLA WHERE FUNCION = @VALOR END END ELSE BEGIN PRINT 'TURNO' SELECT T AS [TURNO] ,AVG(SALARIO) AS [MEDIA] ,COUNT(EMPLEADO_NO) AS [Nº EMPLEADOS] ,SUM(SALARIO) AS [SUMA] FROM PLANTILLA GROUP BY T HAVING T = @VALOR SELECT T AS [TURNO] ,EMPLEADO_NO AS [Nº EMPLEADO] ,APELLIDO, SALARIO FROM PLANTILLA WHERE T = @VALOR END END ELSE BEGIN PRINT 'SALA' SELECT S.NOMBRE AS [SALA] ,AVG(P.SALARIO) AS [MEDIA] ,COUNT(P.EMPLEADO_NO) AS [Nº EMPLEADOS] ,SUM(P.SALARIO) AS [SUMA] FROM PLANTILLA AS P INNER JOIN SALA AS S ON S.HOSPITAL_COD = P.HOSPITAL_COD GROUP BY S.NOMBRE HAVING S.NOMBRE = @VALOR SELECT S.NOMBRE AS [SALA] ,P.EMPLEADO_NO AS [Nº EMPLEADO] ,P.APELLIDO, P.SALARIO FROM PLANTILLA AS P INNER JOIN SALA AS S ON S.HOSPITAL_COD = P.HOSPITAL_COD WHERE S.NOMBRE = @VALOR END END ELSE BEGIN PRINT 'HOSPITAL' SELECT H.NOMBRE AS [HOSPITAL] ,AVG(P.SALARIO) AS [MEDIA] ,COUNT(P.EMPLEADO_NO) AS [Nº EMPLEADOS] ,SUM(P.SALARIO) AS [SUMA] FROM PLANTILLA AS P INNER JOIN HOSPITAL AS H ON H.HOSPITAL_COD = P.HOSPITAL_COD GROUP BY H.NOMBRE HAVING H.NOMBRE = @VALOR SELECT H.NOMBRE AS [HOSPITAL] ,P.EMPLEADO_NO AS [Nº EMPLEADO] ,P.APELLIDO, P.SALARIO FROM PLANTILLA AS P INNER JOIN HOSPITAL AS H ON H.HOSPITAL_COD = P.HOSPITAL_COD WHERE H.NOMBRE = @VALOR END
EXEC EMPPLANTILLA 'GENERAL'
10) Crear un procedimiento en el que pasaremos como parámetro el Apellido de un empleado. El procedimiento devolverá los subordinados del empleado escrito, si el empleado no existe en la base de datos, informaremos de ello, si el empleado no tiene subordinados, lo informa remos con un mensaje y mostraremos su jefe. Mostrar el número de empleado, Apellido, Oficio y Departamento de los subordinados.
CREATE PROCEDURE JEFES @APE NVARCHAR(30) AS DECLARE @EMP INT, @JEFE INT, @SUB INT SELECT @EMP = EMP_NO FROM EMP WHERE APELLIDO = @APE IF (@EMP IS NULL) BEGIN PRINT 'NO EXISTE NINGUN EMPLEADO CON ESTE APELLIDO: ' + @APE END ELSE BEGIN SELECT @JEFE = A.EMP_NO ,@SUB = B.EMP_NO FROM EMP AS A INNER JOIN EMP AS B ON A.EMP_NO = B.DIR WHERE B.DIR = @EMP ORDER BY B.DIR IF (@JEFE IS NULL) BEGIN SELECT A.EMP_NO AS [Nº DE EMPLEADO] ,A.APELLIDO AS [JEFE], A.OFICIO ,A.DEPT_NO AS [Nº DEPARTAMENTO] ,B.EMP_NO AS [Nº EMPLEADO] ,B.APELLIDO AS [SUBORDINADO] ,B.OFICIO ,B.DEPT_NO AS [Nº DEPARTAMENTO] FROM EMP AS A INNER JOIN EMP AS B ON B.DIR = A.EMP_NO WHERE B.EMP_NO = @EMP ORDER BY B.DIR END ELSE BEGIN SELECT A.EMP_NO AS [Nº DE EMPLEADO] ,A.APELLIDO AS [JEFE], A.OFICIO ,A.DEPT_NO AS [Nº DEPARTAMENTO] ,B.EMP_NO AS [Nº EMPLEADO] ,B.APELLIDO AS [SUBORDINADO] ,B.OFICIO ,B.DEPT_NO AS [Nº DEPARTAMENTO] FROM EMP AS A INNER JOIN EMP AS B ON A.EMP_NO = B.DIR WHERE B.DIR = @EMP ORDER BY B.DIR END END
EXEC JEFES 'GARCIA'
11) Crear procedimiento que borre un empleado que coincida con los parámetros indicados (los parámetros serán todos los campos de la tabla empleado).
CREATE PROCEDURE BORRA_EMPLEADO @EMP_NO INT, @APELLIDO NVARCHAR(20), @OFICIO NVARCHAR(20), @DIR INT, @FECHA_ALT SMALLDATETIME, @SALARIO INT, @COMISION INT, @DEPT_NO INT AS DELETE FROM EMP WHERE EMP_NO = @EMP_NO AND APELLIDO = @APELLIDO AND OFICIO = @OFICIO AND DIR = @DIR AND FECHA_ALT = @FECHA_ALT AND SALARIO = @SALARIO AND COMISION = @COMISION AND DEPT_NO = @DEPT_NO
EXEC BORRA_EMPLEADO 7895,'SUAREZ','EMPLEADO',0,'26/05/2015',16000,0,20
12) Modificación del ejercicio anterior, si no se introducen datos correctamente, informar de ello con un mensaje y no realizar la baja. Si el empleado introducido no existe en la base de datos, deberemos informarlo con un mensaje que devuelva el nombre y número de empleado del empleado introducido. Si el empleado existe, pero los datos para eliminarlo son incorrectos, informaremos mostrando los datos reales del empleado junto con los datos introducidos por el usuario, para que se vea el fallo.
CREATE PROCEDURE BORRAEMPLEADO @EMP_NO INT ,@APELLIDO NVARCHAR(20) ,@OFICIO NVARCHAR(20) ,@DIR INT ,@FECHA_ALT SMALLDATETIME ,@SALARIO INT ,@COMISION INT ,@DEPT_NO INT AS DECLARE @VALOR NVARCHAR(30) SELECT @VALOR = EMP_NO FROM EMP WHERE EMP_NO = @EMP_NO AND APELLIDO = @APELLIDO AND OFICIO = @OFICIO AND DIR = @DIR AND FECHA_ALT = @FECHA_ALT AND SALARIO = @SALARIO AND COMISION = @COMISION AND DEPT_NO = @DEPT_NO IF (@VALOR IS NULL) BEGIN SELECT @VALOR = EMP_NO FROM EMP WHERE EMP_NO = @EMP_NO IF (@VALOR IS NULL) BEGIN PRINT 'EMPLEADO NO EXISTENTE EN LA BASE DE DATOS, VERIFIQUE LOS DATOS DEL SR ' + @APELLIDO END ELSE BEGIN PRINT 'DATOS INTRODUCIDOS ERRONEAMENTE: ' PRINT CAST(@EMP_NO AS NVARCHAR(4)) + ' ' + @APELLIDO + ' ' + @OFICIO + ' ' + CAST(@DIR AS NVARCHAR(4)) + ' ' + CAST(@FECHA_ALT AS NVARCHAR(12)) + ' ' + CAST(@SALARIO AS NVARCHAR(10)) + ' ' + CAST(@COMISION AS NVARCHAR(10)) + ' ' + CAST(@DEPT_NO AS NVARCHAR(4)) SELECT @EMP_NO = EMP_NO, @APELLIDO = APELLIDO ,@OFICIO = OFICIO, @DIR = DIR ,@FECHA_ALT = FECHA_ALT, @SALARIO = SALARIO ,@COMISION = COMISION, @DEPT_NO = DEPT_NO FROM EMP WHERE EMP_NO = @VALOR PRINT 'DATOS REALES DEL EMPLEADO: ' PRINT CAST(@EMP_NO AS NVARCHAR(4)) + ' ' + @APELLIDO + ' ' + @OFICIO + ' ' + CAST(@DIR AS NVARCHAR(4)) + ' ' + CAST(@FECHA_ALT AS NVARCHAR(12)) + ' ' + CAST(@SALARIO AS NVARCHAR(10)) + ' ' + CAST(@COMISION AS NVARCHAR(10)) + ' ' + CAST(@DEPT_NO AS NVARCHAR(4)) END END ELSE BEGIN DELETE FROM EMP WHERE EMP_NO = @EMP_NO AND APELLIDO = @APELLIDO AND OFICIO = @OFICIO AND DIR = @DIR AND FECHA_ALT = @FECHA_ALT AND SALARIO = @SALARIO AND COMISION = @COMISION AND DEPT_NO = @DEPT_NO END
EXEC BORRAEMPLEADO 7895,'SUAREZ','EMPLEADO',0,'26/05/2015',16000,0,20
13) Crear un procedimiento para insertar un empleado de la plantilla del Hospital. Para poder insertar el empleado realizaremos restricciones:
- No podrá estar repetido el número de empleado.
- Para insertar, lo haremos por el nombre del hospital y por el nombre de sala, si no existe la sala o el hospital, no insertaremos y lo informaremos.
- El oficio para insertar deberá estar entre los que hay en la base de datos, al igual que el Turno.
- El salario no superará las 500.000 ptas.
- (Opcional) Podremos insertar por el código del hospital o sala y por su nombre.
CREATE PROCEDURE INSERTAR_PLANTILLA @HOSPITAL NVARCHAR(30) ,@SALA NVARCHAR(30) ,@EMPLEADO INT ,@APELLIDO NVARCHAR(30) ,@FUNCION NVARCHAR(30) ,@TURNO NVARCHAR(2) ,@SALARIO INT AS DECLARE @HOSPITAL2 INT DECLARE @SALA2 INT DECLARE @EMPLEADO2 INT DECLARE @APELLIDO2 NVARCHAR(30) DECLARE @FUNCION2 NVARCHAR(30) DECLARE @TURNO2 NVARCHAR(2) SELECT @EMPLEADO2 = EMPLEADO_NO FROM PLANTILLA WHERE EMPLEADO_NO = @EMPLEADO IF (@EMPLEADO2 IS NULL) BEGIN SELECT @SALA2 = SALA_COD FROM SALA WHERE NOMBRE = @SALA SELECT @HOSPITAL2 = HOSPITAL_COD FROM HOSPITAL WHERE NOMBRE = @HOSPITAL IF (@SALA2 IS NULL OR @HOSPITAL2 IS NULL) BEGIN PRINT 'LA SALA O EL HOSPITAL INTRODUCIDO NO ESTÁN EN LOS DATOS:' PRINT 'SALA: ' + @SALA PRINT 'HOSPITAL: ' + @HOSPITAL PRINT '' PRINT 'NO SE HA REALIZADO LA INSERCIÓN' END ELSE BEGIN SELECT @FUNCION2 = FUNCION FROM PLANTILLA WHERE FUNCION = @FUNCION SELECT @TURNO2 = T FROM PLANTILLA WHERE T = @TURNO IF (@FUNCION2 IS NULL OR @TURNO2 IS NULL) BEGIN PRINT 'LA FUNCIÓN O EL TURNO INTRODUCIDOS NO SON VÁLIDOS' PRINT 'FUNCION: ' + @FUNCION PRINT 'TURNO: ' + @TURNO PRINT '' PRINT 'NO SE HA REALIZADO LA INSERCIÓN' END ELSE BEGIN IF (@SALARIO > 500000) BEGIN PRINT 'EL SALARIO MÁXIMO PARA LOS TRABAJADORES DE LA PLANTILLA ES DE 500.000 PTAS' PRINT 'NO SE HA REALIZADO LA INSERCIÓN' END ELSE BEGIN INSERT INTO PLANTILLA(Hospital_Cod,Sala_Cod,Empleado_No,Apellido,Funcion,T,Salario) VALUES (@HOSPITAL2, @SALA2, @EMPLEADO , @APELLIDO, @FUNCION, @TURNO, @SALARIO) PRINT 'INSERCIÓN REALIZADA CORRECTAMENTE' END END END END ELSE BEGIN PRINT 'EL NÚMERO DE EMPLEADO INTRODUCIDO ESTÁ REPETIDO: ' + CAST(@EMPLEADO AS NVARCHAR(4)) PRINT 'NO SE HA REALIZADO LA INSERCIÓN' END
EXEC INSERTAR_PLANTILLA 'La Paz','Recuperación',9584,'Pablo S.','Enfermero','T',474890
Espero haber ayudado en algo. Hasta la próxima oportunidad!
Twittear
Hola desearia me auden con estos dos ejercicios porfavor
ResponderEliminar-Crear un procedimiento almacenado que muestre la consulta de la tabla Product con lo siguiente:
Analizará el campo SellStartDate y por cada año de antigüedad realizará 1% de descuento sobre el
precio de lista (ListPrice), esto se mostrará en una columna adicional.
-Crear un procedimiento almacenado y con las tablas Product y ProductInventory que indique
textualmente en una columna adicional: ‘No hay producto en almacen’ si es que el campo Quantity
(ProductInventory) es cero
se lo agradeceria bastante
Hola Unknown, gracias por la visita y el aporte de tu consulta.
EliminarAlgo rápido sin conocer a detalle los campos de las tablas podría ser lo siguiente.
Consulta 1:
SELECT A.*, ((YEAR(GETDATE()) - YEAR(SellStartDate)) * 0.01 * ListPrice) AS DESCUENTO FROM Product A
Consulta 2:
SELECT A.*, B.*, CASE B.Quantity WHEN 0 THEN 'No hay producto en almacen' ELSE '' END AS OBSERVACION FROM Product A INNER JOIN ProductInventory B ON A.PRODUCTID = B.PRODUCTID
Se puede mejorar la forma de obtener el año através de más funciones pero por ahora eso!
Los mejores deseos!
Muchas gracias, me resultaron muy útiles, saludos.
EliminarHola The Wizard, gracias por la visita y tu comentario.
EliminarQue bueno que haya sido de utilidad!
Saludos!
hola, desearia si me puedes ayudar con estos ejercicios:
ResponderEliminar1.-Teniendo en cuenta las tablas ProductCategory, ProductSubCategory, Product realizar un trigger de tal forma que permita eliminar un dato de ProductCategory, eliminando a la vez los datos que referencia en las tablas ProductSubCategory y Product.
2.-Crear una funcion f_igv que devuelva el 18% de un precio, el precio debera entrar como parámetro, pruebe esta funcion realizando una consulta a la tabla Product, aumentado una columna denominada IGV que haga uso de la función f_igv
Hola Henry, gracias por la visita y el aporte de tu consulta.
EliminarTe pido disculpas por no poder ayudarte en esta oportunidad, debido a motivos laborales y familiares. Quizás otros visitantes puedan aportar la solución.
Saludos!
ayuda con estos ejercicios por favor
Eliminar6.- Teniendo en cuenta las tablas ProductCategory, ProductSubCategory, Product realizar un trigger de tal forma que permita eliminar un dato de ProductCategory, eliminando a la vez los datos que referencia en las tablas ProductSubCategory y Product.
7.-Crear una funcion f_igv que devuelva el 18% de un precio, el precio debera entrar como parámetro, pruebe esta funcion realizando una consulta a la tabla Product, aumentado una columna denominada IGV que haga uso de la función f_igv..
muchas gracias de antemano
Hola Anónimo, esperemos que otros colegas puedan brindarnos su conocimiento en cuanto a estos ejercicios. Los mejores deseos para este 2021.
Eliminarcrear un procedimiento informe detallado de los empleados que trabajan en un departamento ayúdeme con esa tarea
ResponderEliminar