sábado, 9 de mayo de 2015

Ejercicios con CASE en SQL Server



1. Queremos saber a qué empleados eliminariamos si quitasemos los departamentos 10 y 30 y cúales se mantendrían. Mostrar un informe con el apellido, salario, oficio y fechas de alta en la empresa.

SELECT APELLIDO,SALARIO,DEPT_NO,OFICIO,'ACCION' = CASE
WHEN DEPT_NO <> 10 THEN 'EMPLEADO DE BAJA'
ELSE
'SE MANTIENE'
END
FROM EMP WHERE OFICIO = 'EMPLEADO'


2. Debemos hacer recortes de salario en la empresa, para ello debemos saber a que personas recortaremos el sueldo, cuales se mantendrán y cuales subiremos el puesto. Utilizar todos los empleados de la empresa(Plantilla y Empleados) 
Cuando el salario sea menor de 100000, Subiremos sueldo, cuando esté entre 100000 y 250000 lo mantendremos y cuando sea superior, lo bajaremos.

SELECT APELLIDO, SALARIO, 'ACCION' = CASE
WHEN SALARIO < 100000 THEN 'SUBIR SUELDO'
WHEN SALARIO BETWEEN 150000 AND 250000 THEN 'MANTENER SUELDO'
ELSE
'BAJAR SUELDO'
END
FROM EMP
UNION
SELECT APELLIDO,SALARIO, 'ACCION' = CASE
WHEN SALARIO < 100000 THEN 'SUBIR SUELDO'
WHEN SALARIO BETWEEN 150000 AND 250000 THEN 'MANTENER SUELDO'
ELSE
'BAJAR SUELDO'
END
FROM PLANTILLA


3. Queremos saber que empleados de la plantilla trabajan en turno de tarde, noche o en otros, para ello mostraremos ‘Tarde’ o ‘Noche’ dependiendo de sus valores.

SELECT 'NÚMERO EMPLEADO' = EMPLEADO_NO, 'APELLIDO' = APELLIDO,
'TURNO' = CASE T
WHEN 'T' THEN 'TARDE'
WHEN 'M' THEN 'MAÑANA'
ELSE 'OTROS'
END
FROM PLANTILLA


4. Queremos cambiar de localidad en Barcelona, para ello tenemos que saber qué empleados cambiarian de localidad y cúales no. Combinar tablas y mostrar el nombre del departamento junto a los datos del empleado.

SELECT D.DNOMBRE AS [DEPARTAMENTO]
,E.APELLIDO,'CAMBIAR DE LOCALIDAD' = CASE
WHEN D.LOC = 'SEVILLA' THEN 'CAMBIA DE LOCALIDAD'
ELSE
'NO CAMBIA DE LOCALIDAD'
END
FROM EMP AS E INNER JOIN DEPT AS D
ON E.DEPT_NO = D.DEPT_NO


5. Queremos saber el número de trabajadores que cambiarían de localidad si cambiasemos a Barcelona y que número de trabajadores no cambiarian de localidad.

SELECT COUNT(E.EMP_NO) AS [Nº DE TRABAJADORES],
D.LOC AS [CIUDAD],'CAMBIAR' = CASE
WHEN D.LOC = 'BARCELONA' THEN 'CAMBIA DE LOCALIDAD'
ELSE 'NO CAMBIA'
END
FROM EMP AS E INNER JOIN DEPT AS D
ON D.DEPT_NO = E.DEPT_NO
GROUP BY D.LOC


6. Mostrar el apellido, la dirección, la fecha de nacimiento mostrando la década en la que está cada persona y el sexo mostrando si es masculino o femenino de la tabla enfermo.

SELECT APELLIDO, DIRECCION,
[FECHA NACIMIENTO] = CASE
WHEN FECHA_NAC BETWEEN '01/01/1940' AND '01/01/1950' THEN
'DECADA DE LOS 40'
WHEN FECHA_NAC BETWEEN '01/01/1950' AND '01/01/1960' THEN
'DECADA DE LOS 50'
WHEN FECHA_NAC BETWEEN '01/01/1960' AND '01/01/1970' THEN
'DECADA DE LOS 60'
WHEN FECHA_NAC BETWEEN '01/01/1970' AND '01/01/1980' THEN
'DECADA DE LOS 70'
WHEN FECHA_NAC BETWEEN '01/01/1980' AND '01/01/1990' THEN
'DECADA DE LOS 80'
ELSE
'DEMASIADO VIEJO O DEMASIADO JOVEN'
END
,SEXO = CASE S
WHEN 'F' THEN 'MUJER'
ELSE
'HOMBRE'
END
FROM ENFERMO
ORDER BY FECHA_NAC,S


7. Mostrar el apellido, el salario, el oficio y el nombre del departamento de todos los empleados aunque no tengan departamento. Si no tienen departamento mostraré que no tienen departamento. Mostraré además si tienen comisión o si no tienen comisión.

SELECT E.APELLIDO,E.OFICIO,E.SALARIO
,DEPARTAMENTO =
ISNULL(D.DNOMBRE,'SIN DEPARTAMENTO')
,COMISION = CASE COMISION
WHEN 0 THEN 'SIN COMISION'
ELSE
'CON COMISION'
END
FROM EMP E
LEFT JOIN DEPT D
ON E.DEPT_NO = D.DEPT_NO
ORDER BY D.DNOMBRE


8. Mostrar todas las camas que existen para cada hospital y cada sala. Mostraré el nombre del hospital, las salas y su número de camas. Si no hubiese camas para algún hospital las dejaré a 0. También mostraré que son muchas camas cuando sean más de 90, buen número cuando sean mayores de 40 y pocas camas para las demás.

SELECT H.NOMBRE AS [HOSPITAL]
,ISNULL(S.NUM_CAMA,0) AS [Nº DE CAMAS]
,S.NOMBRE AS [SALAS]
,CAMAS = CASE
WHEN S.NUM_CAMA > 90 THEN'DEMASIADAS CAMAS'
WHEN S.NUM_CAMA BETWEEN 40 AND 89 THEN 'BUEN NUMERO'
ELSE
'POCAS CAMAS'
END
FROM SALA AS S
FULL JOIN HOSPITAL AS H
ON H.HOSPITAL_COD = S.HOSPITAL_COD
GROUP BY H.NOMBRE,S.NUM_CAMA,S.NOMBRE
ORDER BY H.NOMBRE,S.NUM_CAMA


9. Seleccionar qué empleados están dentro de la media y cuales están por debajo de la media, mostrando el apellido, oficio, salario, comisión y el nombre de los departamentos. No dejar ningún campo a NULL. 

DECLARE @MEDIA INT
SELECT @MEDIA = AVG(SALARIO) FROM EMP<
SELECT E.APELLIDO,E.OFICIO,E.SALARIO,E.COMISION
,MEDIA = CASE
WHEN SALARIO > @MEDIA THEN 'DENTRO DE LA MEDIA'
ELSE
'POR DEBAJO DE LA MEDIA'
END
,ISNULL(D.DNOMBRE,'SIN DEPARTAMENTO') AS DEPARTAMENTO
FROM EMP AS E
LEFT JOIN DEPT D
ON E.DEPT_NO = D.DEPT_NO
GROUP BY E.APELLIDO,E.OFICIO,E.SALARIO,E.COMISION,D.DNOMBRE
ORDER BY MEDIA


Descargar Scripts SQL

Espero haber ayudado en algo. Hasta la próxima oportunidad!








1 comentario:

  1. EL EJERCICIO 6 ESTÁ MAL, YA QUE EL TIPO DE DATO DEL CAMPO FECHA ES NVARCHAR, POR CONSIGUIENTE NO SE PUEDEN USAR CON "BETWEEN" Y "AND", como si fuese un INT.

    ResponderEliminar