Anda di halaman 1dari 35

PAUS 4to curso Convocatoria 2011 UNI

CURSOS LIBRES - UNIVERSIDAD DE INGENIERIA 20 de diciembre de 2011 Autor: Jarold beda Gmez, Herty Isaguirre Gonzlez , Norlan Aguilar Silva

SQL Server 2008


PAUS 4to curso Convocatoria 2011 UNI

Enunciado 1) Mostrar todos los datos de los empleados de nuestra tabla Emp. Sentencia
SELECT * FROM Emp

Salida de datos

Enunciado. 2) Mostrar el apellido, oficio, salario anual, con las dos extras para aquellos empleados con comisin mayor de 100,000. Sentencia.
SELECT E.Apellido,E.Oficio,E.Salario * 14 as [Salario Anual],E.Comision FROM Emp as E WHERE E.Comision > 100000

Salida de datos.

SQL Server 2008 | 20/12/2011

Enunciado. 3) dem anterior, pero para aquellos empleados que su salario anual con extras supere los 2.200.000 ptas. Sentencia.
SELECT E.Apellido,E.Oficio,E.Salario * 14 + E.Comision as [Salario Anual con Extras] FROM Emp as E WHERE E.Salario * 14 + E.Comision > 2200000

Salida de datos.

Enunciado. 4) dem del anterior, pero para aquellos empleados que sumen entre salario anual con extras y comisin los 3.000.000 millones. Sentencia.
SELECT E.Apellido,E.Oficio,E.Salario * 14 + E.Comision as [Salario Anual con Extras] FROM Emp as E WHERE E.Salario * 14 + E.Comision >= 3000000

Salida de datos.

Enunciado. 5) Mostrar todos los datos de los empleados ordenandos por departamento y dentro de este por oficio para tener una visin jerrquica. Sentencia.
SELECT * FROM Emp as E

SQL Server 2008 | 20/12/2011

ORDER BY E.Dept_no,E.Oficio

Salida de datos.

Enunciado. 6) Mostrar todas las salas para el hospital 45. Sentencia.


SELECT S.Nombre FROM Sala S WHERE Hospital_Cod = (45)

Salida de datos.

Enunciado. 7) Mostrar todos los enfermos antes de 1970 Sentencia.


SELECT * FROM Enfermo E WHERE year(E.Fecha_Nac) < 1970

Salida de datos.
SQL Server 2008 | 20/12/2011

Enunciado. 8) Igual que el anterior, para los nacidos antes de 1970 ordenados por nmero de inscripcin descendente. Sentencia.
SELECT * FROM Enfermo E WHERE year(E.Fecha_Nac) < 1970 ORDER BY E.Inscripcion DESC

Salida de datos.

Enunciado. 9) Listar todos los datos de la plantilla del hospital del turno de la maana. Sentencia.
SELECT * FROM Plantilla WHERE T = 'M'

Salida de datos.

Enunciado. 10) dem turno de la noche. Sentencia.


SELECT * FROM Plantilla WHERE T = 'N' SQL Server 2008 | 20/12/2011

Salida de datos.

Enunciado. 11) Visualizar los empleados de la plantilla del turno de la maana que tengan un salario entre 200.000 y 225.00 ptas. Sentencia.
SELECT * FROM Plantilla WHERE T = 'M' AND

Salario BETWEEN 200000 AND 225000

Salida de datos.

Enunciado. 12) Visualizar los empleados de la tabla Emp que no se dieron de alta entre el 01/01/08 y el 12/12/82. Sentencia.
SELECT * FROM Emp WHERE not Fecha_Alt Between '010108' and '121282'

Salida de datos.

Enunciado. 13) Mostrar los nombres de los departamentos situados en Madrid o Barcelona. Sentencia.
SELECT * FROM Dept WHERE Loc in ('Barcelona', 'Madrid')

SQL Server 2008 | 20/12/2011

Salida de datos.

Enunciado. 1) Mostrar aquellos empleados con fecha de alta posterior al 1 de Julio de 1985. Sentencia.
select * from emp where fecha_alt > '01-07-1985'

Salida de datos.

Enunciado. 2) Lo mismo que el ejercicio 1 pero con salario entre 150000 y 400000. Sentencia.
SELECT * FROM Emp WHERE Fecha_Alt > '01-01-1985' and Salario BETWEEN 150000 AND 400000

Salida de datos.

Enunciado. 3) Igual que el ejercicio 2 pero tambin incluimos aquellos que no siendo analista pertenecen al departamento 20. Sentencia.
SELECT * FROM Emp WHERE Fecha_Alt > '01-01-1985' and Salario BETWEEN 150000 AND 400000 or Oficio <> 'Analista' and Dept_no = 20

Salida de datos.
SQL Server 2008 | 20/12/2011

Enunciado. 4) Mostrar aquellos empleados cuyo apellido termine con Z ordenados por departamento, y dentro de este por antigedad. Sentencia.
SELECT * FROM Emp WHERE APELLIDO LIKE '%Z' ORDER BY Dept_no,Fecha_Alt DESC

Salida de datos.

Enunciado. 5) De los empleados del ejercicio 5 quitar aquellos que superen las 200000 ptas mensuales. Sentencia.
SELECT * FROM Emp as E WHERE Salario > 200000 ORDER BY E.Dept_no,E.Oficio

Salida de datos.

SQL Server 2008 | 20/12/2011

Enunciado. 6) Mostrar todos los empleados cuyo oficio no sea analista. Sentencia.
SELECT * FROM Emp WHERE Oficio <> 'Analista'

Salida de datos.

Enunciado. 7) Igual que el 6, pero mostrndolos de forma que se aprecien las diferencias de salario dentro de cada oficio. Sentencia
SELECT * FROM Emp WHERE Oficio <> '%Analista%' ORDER BY Salario

Salida de datos.

SQL Server 2008 | 20/12/2011

Enunciado. 8) De los del 7, nos quedamos con aquellos cuyo nmero de empleado no este entre 7600 y 7900. Sentencia.
SELECT * FROM Emp WHERE Oficio <> 'Analista' AND Emp_No NOT BETWEEN 7600 AND 7900 ORDER BY Salario

Salida de datos.

Enunciado. 9) Mostrar los distintos oficios de los empleados. Sentencia.


SELECT DISTINCT Oficio FROM Emp

Salida de datos.

Enunciado. 10) Mostrar los distintos nombres de las salas. Sentencia.


SQL Server 2008 | 20/12/2011 SELECT DISTINCT Nombre FROM Sala

Salida de datos.

Enunciado. 11) Mostrar que personal No Interino existe en cada sala de cada hospital, ordenado por hospital y sala. Sentencia.
SELECT * FROM Plantilla WHERE Funcion NOT LIKE 'Interino' ORDER BY Sala_Cod,Hospital_Cod

Salida de datos.

Enunciado. 12) Justificar el resultado de la siguiente consulta SELECT APELLIDO DISTINCT DEP_NO FROM EMP; Indicar que ocurre y modificar para que todo vaya bien. Sentencia. Al ejecutar la consulta muestra este mensaje de error:
Incorrect syntax near the keyword 'DISTINCT'. Msg 156, Level 15, State 1, Line 1

Para corregirlo se necesit colocar el predicado DISTINCT despus del comando SELECT
SELECT DISTINCT APELLIDO DEP_NO FROM EMP

Salida de datos.

Enunciado,
SQL Server 2008 | 20/12/2011

13) Seleccionar los distintos valores del sexo que tienen los enfermos. Sentencia.
SELECT DISTINCT S FROM Enfermo

Salida de datos.

10

Enunciado, 14) Indicar los distintos turnos de la plantilla del hospital, ordenados por turno y por apellido. Sentencia.
SELECT Apellido,T FROM Plantilla ORDER BY T desc,Apellido ASC

Salida de datos.

Enunciado. 15) Seleccionar las distintas especialidades que ejercen los mdicos, ordenar por especialidad y apellido. Sentencia.
SELECT Apellido,Especialidad FROM Doctor ORDER BY Especialidad,Apellido

Salida de datos.

11

SQL Server 2008 | 20/12/2011

1) Seleccione todos los empleados cuyo apellido comince con M. Sentencia.


select * from Emp where Apellido Like 'M%'

Salida de datos.

2) Seleccione todos los empleados cuyo apellido comince con Z. Sentencia.


select * from Emp where Apellido like '%Z'

Salida de datos.

3) Selecciono todos los empleados que en su apellido contengan ER. Sentencia.


select * from Emp where Apellido like '%ER%' SQL Server 2008 | 20/12/2011

Salida de datos.

12

4) MOstrar todos los empleados cuyo nombre sea de cuatro letras y su apellido termine con la letra A. Sentencia.
select * from Emp where Apellido like '___a'

Salida de datos.

5) Mostrar todos los empleados cuyo apellido comiense entre las letras E y F. Sentencia.
select * from Emp where Apellido like '[e-f]%' order by Apellido

Salida de datos.

6) Mosrtar todos los empleados cuyo apellido comiense por la letra A, contenga dentro de su apellido de la letra A a la M y que termine en O. Sentencia.
select * from Emp where Apellido like 'A%[a-m]%o'

Salida de datos.

7) mostrar todos los empleados cuyo apellido comience por la letra M y la segunda letra no sea una A.
SQL Server 2008 | 20/12/2011

Sentencia.
select * from Emp where Apellido like'M[^a]%'

Salida de datos.

13

8) Mosrtar todos los empleados cuyo Apellido sea de 5 letras y su tercera letra sea entre la A y la S terminando en Z. Sentencia.
select * from Emp where Apellido like '__[a-s]_z'

Salida de datos.

9) Mostrar todos los empleados cuyo apellido sea de 6 letras y no comiense entre la A y la D. Sentencia.
select * from Emp where Apellido like '[^a-d]_____'

Salida de datos.

10) Mostrar todos los que empiecen por la A y cuya cuarta letra no este comprendida entre A y G. Sentencia.
select * from Emp where Apellido like 'A___[^a-g]%'

Salida de datos.
SQL Server 2008 | 20/12/2011

14

1) Encontrar el salario medio de los Analistas, mostrando el nmero de los empleados con oficio analista. Sentencia.
select Oficio, count (*) as Cantidad, avg(Salario) as [Promedio Salarial] from Emp group by Oficio having Oficio = 'Analista'

Salida de datos.

2) Encontrar el salario mas bajomy el mas alto y mostrar la diferencia entre ambos de todos los empleados con oficio empleado. Sentencia.
select Oficio,count (*) as Empleado ,Max(salario) as [Mejor salario], min(salario) as [Menor salario], (max(salario) - Min(salario)) as [Diferencia] from Emp group by Oficio having Oficio = 'Empleado'

Salida de datos.

3) Visualizar los salarios mayores para cada oficio. Sentencia.


select Oficio, max(salario) as [mejor Salario] from emp group by Oficio SQL Server 2008 | 20/12/2011

Salida de datos.

15

4) Visualizar el nmero de personas que realizan cada oficio en cada departamento. Sentencia.
select Dept_no, Oficio, count(*) as [Empleados] from Emp group by dept_no, oficio order by dept_no, oficio

Salida de datos.

5) Buscar aquellos departamentos con cuatro o mas personas trabajando. Sentencia.


select dept_no, count (*) as Empleados from Emp group by dept_no having Count(*) >=4

Salida de datos.

6) Mostrar el nmero de directores que existen por departamento. Sentencia.


SQL Server 2008 | 20/12/2011 select dept_no, Oficio, count (*) as Cantidad from Emp group by dept_no, Oficio having oficio = 'Director'

Salida de datos.

16

7) Visualizar el numerto de enfermeros, Enfermeras e interinos que hay en la plantilla, ordenados por la funcion. Sentencia.
select Funcion, Count(*) as Cantidad from Plantilla group by Funcion having Funcion in ('Enfermero','Enfermera','Interino') Order by Funcion

Salida de datos.

8) Visualizar departamentos, oficios y nmero de personas, para aquellos que tengan dos o mas trabajando en el mismo oficio. Sentencia.
select D.Dnombre as Departamento,E.Oficio,COUNT(E.Oficio) as[Trabajadores] from Dept D inner join Emp E on E.Dept_no = D.Dept_No group by D.Dnombre,E.Oficio having COUNT(*)>=2

Salida de datos.

9) Calcular el salario medio, diferencia, maximo y minimo de cada oficio. Indicando el oficio y el nmero de empleados de cada oficio. Sentencia.
select Oficio, count (*) as cantidad, max (Salario) as [Mejor salario], min(Salario) as [Menor salario], Avg (salario) as [Promedio Salarial], max(Salario) - min (salario) as diferencia from emp group by Oficio

Salida de datos.

10) Calcular el valor medio de las camas que existen en para cada nombre de sala. Indicar el nombre da cada sala y el nmero de cada una de ellas.
SQL Server 2008 | 20/12/2011

Sentencia.
select nombre as Sala, count(*) as [Cant de salas], sum( num_cama)as Total, Avg (num_cama) as [Promedio de Camas] from sala group by Nombre

Salida de datos.

17

11) Calcular el salario medio de la plantilla de la sala 6, segun la funcion que realizan. Indicar la funcion y el nmero de empleados. Sentencia.
select sala_cod, Funcion , count(*) as cantidad, Avg(salario) as [Salario Medio] from Plantilla group by Funcion, Sala_cod Having Sala_cod = 6

Salida de datos.

12) Averiguar los ltimos empleados que se dieron de alta en la empresa en cada uno de los oficios ordenados por la fecha. Sentencia.
select Oficio, max ( fecha_Alt) as [Fecha de ingreso] from Emp Group by Oficio, Fecha_Alt order by Oficio, Fecha_Alt desc

Salida de datos.

13) Mostrar el nmero de hombres y mujeres que hay entre los enfermos. Sentencia.
select S as Sexo, Count(*) as cantidad from Enfermo Group by S

Salida de datos. 14) Mostrar la suma total del salario de los empleados de la plantilla para cada funcion y turno. Sentencia.
select Funcion, T as Turno, Sum (salario) as from Plantilla group by Funcion,T order by Funcion,T [total de Salario]

Salida de datos.

15) Calcular el nmero de salas que existen en cada hospital. Sentencia.


select hospital_cod,Count(*) as [Sala] From Sala group by Hospital_cod

Salida de datos.

18

SQL Server 2008 | 20/12/2011

16) mostrar el nmero de enfermeras que existan por cada sala. Sentencia.
select Hospital_cod ,sala_cod as sala, count (*) as [Enfermeras] from Plantilla group by Hospital_cod,sala_cod,Funcion having Funcion = 'Enfermera' order by hospital_cod,sala_cod

Salida de datos.

1) Realizar una consulta que muestren los nombres de los autores y editores ubicados en la misma ciudad. Sentencia. select A.au_fname+' '+A.au_lname as [AUTORES],P.pub_name as [EDITORIAL], P.city as[CIUDAD] from authors A inner join Publishers P on A.city = P.city Salida de datos.

2) Obtener todos los nombres y editores de todos los libros cuyos anticipos pagados son superiores a 7500. Sentencia. select t.title as[TITULO],p.pub_name as[EDITORIAL],t.advance as[ANTICIPO] from titles t inner join publishers p on t.pub_id = p.pub_id where t.advance > 7500 Salida de datos. SQL Server 2008 | 20/12/2011

19

3) Seleccionar todos los titulos, nombre y apellidos del autor de todos los libros de cocina tradicional. Sentencia. select A.au_lname+' '+A.au_fname as[AUTORES],T.title as[LIBRO],T.[type] as COCINA_TRADICIONAL from Authors A inner join titleauthor TA on TA.au_id = A.au_id inner join Titles T on T.title_id = TA.title_id where t.[type] = 'trad_cook' Salida de datos.

4) Seleccione nombre, apellido de los autores y el nombre de la editorial de todos aquellos escritores cuya ciudad sea la misma que la de la editorial. Pero en la consulta tambin se incluirn los dems autores de la tabla authors. Sentencia. SELECT A.au_fname+' '+A.au_lname as[AUTORES],A.city as Ciudad_Autor,P.pub_name as[EDITORIAL],P.city as Ciudad_Editorial FROM Authors A inner join titleauthor TA on TA.au_id = A.au_id inner join titles T on T.title_id = TA.title_id inner join Publishers P on P.pub_id = T.pub_id ORDER BY P.city

Salida de datos.

5) Recuperar los ttulos y el ndice del almacn de todos los libros que vendieron ms de 25 unidades. Sentencia SELECT T.TITLE AS LIBRO,S.QTY AS CANTIDAD,A.AU_FNAME+' '+A.AU_LNAME AS NOMBRES,A.CITY AS CIUDAD_AUTOR, P.PUB_NAME AS EDITORIAL,P.CITY AS CIUDAD_DE_LA_EDITORIAL FROM PUBLISHERS P INNER JOIN TITLES T ON T.PUB_ID = P.PUB_ID INNER JOIN TITLEAUTHOR TA ON TA.TITLE_ID = T.TITLE_ID INNER JOIN AUTHORS A ON A.AU_ID = TA.AU_ID

20

SQL Server 2008 | 20/12/2011

INNER JOIN SALES S ON S.TITLE_ID = T.TITLE_ID where S.qty > 25 Salida de datos.

6) Modificacin al ejercicio anterior: incluir tambin los ttulos de aquellos libros que no superaron las 25 unidades en sus ventas. Sentencia. SELECT T.TITLE AS LIBRO,S.QTY AS CANTIDAD,A.AU_FNAME+' '+A.AU_LNAME AS NOMBRES,A.CITY AS CIUDAD_AUTOR, P.PUB_NAME AS EDITORIAL,P.CITY AS CIUDAD_DE_LA_EDITORIAL FROM PUBLISHERS P INNER JOIN TITLES T ON T.PUB_ID = P.PUB_ID INNER JOIN TITLEAUTHOR TA ON TA.TITLE_ID = T.TITLE_ID INNER JOIN AUTHORS A ON A.AU_ID = TA.AU_ID INNER JOIN SALES S ON S.TITLE_ID = T.TITLE_ID WHERE S.QTY < 25 ORDER BY A.AU_FNAME,A.AU_LNAME

Salida de datos.

21

SQL Server 2008 | 20/12/2011

7) Realizar una consulta que devuelva el ttulo, editorial y autor de cada libro. Sentencia. select T.title as[LIBRO],A.au_fname+' '+A.au_lname as[AUTORES],P.pub_name as[EDITORIAL] from Titles T inner join Publishers P on T.pub_id = P.pub_id inner join Titleauthor TA on TA.title_id = T.title_id inner join Authors A on A.au_id = TA.au_id Salida de datos.

1) Seleccionar el apellido, oficio, salario, nmero de departamento y su nombre de todos los empleados cuyo salario sea mayor de 300000. Sentencia.
select E.Apellido,E.Oficio,D.Dnombre as[Departamento],E.Salario from Emp E inner join Dept D on D.Dept_No = E.Dept_no where E.Salario > 300000

Salida de datos.

2) Mostrar todos los nombres de Hospital con sus nombres de salas correspondientes. Sentencia.
select H.Nombre as[Hopital],S.Nombre as[Sala] from Hospital H inner join Sala S on S.Hospital_Cod = H.Hospital_Cod

Salida de datos.

3) Calcular cuntos trabajadores de la empresa hay en cada ciudad. Sentencia.


select D.Loc as[Ciudad],Count(*) as [Cantidad de Empleados] from Emp E inner join Dept D on D.Dept_No = E.Dept_no group by D.Loc

Salida de datos.

select upper(D.Dnombre)as [Departamento],E.Oficio,count(E.Oficio) as[Cantidad] from Emp E inner join Dept D on D.Dept_No = E.Dept_no group by D.Dnombre,E.Oficio order by d.dnombre,e.oficio

Salida de datos.

22

SQL Server 2008 | 20/12/2011

4) Visualizar cuantas personas realizan cada oficio en cada departamento mostrando el nombre del departamento. Sentencia.

5) Contar cuantas salas hay en cada hospital, mostrando el nombre de las salas y el nombre del hospital. Sentencia.
select H.Nombre as[Hospital],COUNT(S.nombre) as Total_Salas from Hospital H inner join Sala S on S.Hospital_Cod = H.Hospital_Cod group by H.Nombre

Salida de datos.

6) Calcular cuntos trabajadores hay en cada departamento (nombre de departamento). Sentencia.


select upper(D.Dnombre)as Departamento,COUNT(*) as Total_Trabajadores from Emp E inner join Dept D on D.Dept_No = E.Dept_no group by D.Dnombre

Salida de datos.

7) Buscar aquellos departamentos con cuatro o ms personas trabajando. Sentencia:


select D.Dnombre as Departamento,COUNT(*) as Total_Trabajadores from Emp E inner join Dept D on D.Dept_No = E.Dept_no group by D.Dnombre having count(*) >= 4

Salida de datos.

SQL Server 2008 | 20/12/2011

8) Calcular el valor medio de las camas que existen para cada nombre de sala. Indicar el nombre de cada sala y el cdigo de cada una de ellas. Sentencia.
select Sala_Cod,Nombre as[Sala],AVG(Num_Cama) as Media_Camas from Sala group by Sala_Cod,Nombre

Salida de datos.

23

9) Calcular la media salarial por ciudad. Sentencia.


select D.Loc as Ciudad,avg(E.Salario) as Salario_Medio from Emp E inner join Dept D on D.Dept_No = E.Dept_no group by D.Loc

Salida de datos.

10) Mostrar los doctores junto con el nombre de hospital en el que ejercen, la direccin y el telfono del mismo.

Sentencia.
select D.Apellido as Nombre,H.Nombre as Hospital,H.Direccion,H.Telefono from Doctor D inner join Hospital H on H.Hospital_Cod = D.Hospital_Cod order by D.apellido

Salida de datos.

11) Mostrar los nombres de los hospitales junto con el mejor salario de los empleados de cada hospital. Sentencia.
select H.Nombre as Hopitales,MAX(P.Salario) as Mejor_Salario from Hospital H inner join Plantilla P on P.Hospital_Cod = H.Hospital_Cod group by H.Nombre order by max(p.salario) desc

Salida de datos.

12) Visualizar el nombre de los empleados de la plantilla junto con el nombrede la sala, el nombre del hospital y el nmero de camas libres de cada una de ellas. Sentenica.
select H.nombre as[Hospital],h.Num_cama - sum(S.num_cama) as[N de camas] from Sala S inner join Hospital as H on H.hospital_cod = s.hospital_cod group by h.nombre,h.Num_cama

Salida de datos.

24

SQL Server 2008 | 20/12/2011

13) Visualizar el mximo salario, mnimo salario de los empleados dependiendo de la ciudad en la que trabajen. Indicando el nmero total de trabajadores por ciudad. Sentencia.
select COUNT(E.Emp_No) as N_Empleados,D.Loc as Ciudad, max(Salario) as Mejor_Salario,min(Salario) as Menor_Salario from Emp E inner join Dept D on D.Dept_No = E.Dept_no group by D.Loc order by max(E.Salario) desc ,min(E.Salario)

Salida de datos.

14) Averiguar la combinacin de que salas podra haber por cada uno de los hospitales. Esta consulta tiene dos formas de realizarse; Implcitamente y explcitamente. Sentencia.
Explcitamente select s.nombre as [Sala]h.nombre as [Nombre Hospital], from sala as s cross join hospital as h Implcitamente select S.Nombre as Sala,H.Nombre as Hospital from Sala S,Hospital H

Salida de datos.

15) Mostrar el Nmero de empleado, apellido, oficio y Nombre del departamento de los empleados, junto al Nmero de empleado, apellido, oficio y Nombre del departamento de sus subordinados respectivamente, para obtener una visin jerrquica de la empresa. Sentencia.
select A.emp_no as Codigo_Empl,a.Apellido as Empleado, A.Oficio,D.DNombre as Departamento, A.dir as Codigio_del_Jefe,b.Apellido as Superior from emp as a inner join emp as b on a.dir = b.emp_no inner join dept as d on a.dept_no = d.dept_no

SQL Server 2008 | 20/12/2011

Salida de datos.

25

1) Queremos saber a que empleados eliminariamos si quitasemos los departamentos 10 y 30 y cuales se mantendrian. Mostrar un informe con el apellido,salario,oficio y fechas de alta en la empresa. Sentencia. select e.apellido,e.salario,e.oficio,e.fecha_alt, case when e.dept_no in (10,30) then 'eliminar' else 'mantener' end as operacion from emp e order by e.dept_no

2) Debemos hacer recortes de salario en la empresa,para ello debemos saber a que personas recordaremos el sueldo,cuales se mantendran y cuales subiremos el puesto. Utilizar todos los empleados de la empresa (plantilla y Empleados) cuando el salario menor de 100000, subiremos sueldo, cuando este entre 100000 y 250000 lo mantendremos y cuando sea superior, lo bajaremos select e.apellido as empleado, e.oficio as oficio,e.salario, case when e.salario < 100000 then 'subir' when e.salario between 100000 and 250000 then 'mantener' else 'bajar' end as operacion from emp e union select p.apellido as empleado,p.funcion as oficio, p.salario, case when p.salario < 100000 then 'subir' when p.salario between 100000 and 250000 then 'mantener' else 'bajar' end as operacion from plantilla p

26

SQL Server 2008 | 20/12/2011

3) Queremos saber que empleados de la plantilla trabajan en un turno de tarde, noche o en otros, para ello mostraremos tarde o noche dependiendo de sus valores. select p.apellido,p.funcion,case when p.t='M' then 'maana' when p.t='t' then 'tarde' when p.t='n' then 'noche' end as turno from plantilla p order by p.t

27

SQL Server 2008 | 20/12/2011

4) Queremos cambiar de localidad ven Barcelona, para ello tenemos que saber que empleados cambiaran de localidad y cuales no. Combinar tablas y mostrar el nombre del departamento junto a los datos del empleado. select d.dnombre as departamento,d.loc as localidad,e.apellido as empleado, case d.loc when 'barcelona' then 'cambiar' else 'mantener' end as operacin from emp e inner join dept d on e.dept_no=d.dept_no

5) Queremos saber el nmero de trabajadores que cambiaran de localidad si cambisemos a Barcelona y que nmero de trabajadores no cambiaran de localidad. select d.dnombre as departamento,d.loc as localidad,count(*) as no, case when d.loc = 'barcelona' then 'cambiar' else 'mantener' end as operacion from emp e inner join dept d on e.dept_no=d.dept_no group by d.dnombre,d.loc --Total de Elementos select 'cambiar' as operacion, count(*) as cantidad from emp e inner join dept d on e.dept_no=d.dept_no where d.loc = 'Barcelona' union select 'Mantener' as operacion, count(*) as cantidad from emp e inner join dept d on e.dept_no=d.dept_no where d.loc <>'Barcelona' --case select operacion,count(*) as cantidad from (select case when d.loc = 'Barcelona' then 'Cambiar' else 'mantener' end as operacion from emp e inner join dept d on e.dept_no= d.dept_no) m group by Operacin

6) Mostrar el apellido, la direccin, la fecha de nacimiento mostrando la dcada en la que esta cada persona y el sexo mostrando si es masculino o femenino de la tabla enfermo. select e.apellido as enfermo, e.direccion,e.fecha_nac, substring(cast(year(e.fecha_nac)as varchar),3,1) + '0' as decada, case e.s when 'f' then 'femenino' when 'm' then 'masculino' end as sexo from enfermo e SQL Server 2008 | 20/12/2011

28

8)

select h.nombre as [HOSPITAL],isnull(s.num_cama,0)as[N DE CAMAS], s.nombre as[SALAS], CAMAS = CASE when s.num_cama > 90then '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 Salida de datos

9)

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 Departemento 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 Salida de datos

29

SQL Server 2008 | 20/12/2011

1)Dar de alta con fecha actual al empleado jose escriche barrera como programador perteneciente al departamento de informatica.tendra un salario base de C$ 70,000 por mes y no cobrara comision, Qu dificultad plantea el alta de este empleado?como podria solucionarse? Sentencia. Insert into DEPT(DEPT_NO, DNOMBRE, LOC) values(50,'INFORMATICA','MANAGUA') --Agregar empleado INSERT INTO EMP(EMP_NO, APELLIDO, OFICIO, DIR, FECHA_ALT, SALARIO, COMISION, DEPT_NO) VALUES(9989,'ESCRICHE','PROGRAMADOR',7839, GETDATE(),70000,0,50) --VERIFICAR INGRESO select e.apellido,e.fecha_alt,e.oficio,e.salario,d.dnombre as departamento from emp e inner join dept d on e.dept_no = d.dept_no where e.emp_no = 9989

3)El departamento de ventas por motivos de peseteros se traslada a lerida, realizar dicha modificacion. select * from dept where dnombre = 'ventas' update dept set loc = 'lerida' where dnombre = 'ventas'

4) En el departamento anterior se dan de alta dos empleados: Julian Romeral y luis alonso.Su salario base es de C$ 80,000 y Cobraran una comision del 15% de su salario. select e.emp_no,e.apellido,e.fecha_alt,e.oficio,e.salario,d.dnombre as departamento from emp e inner join dept d on e.dept_no = d.dept_no where D.dnombre = 'ventas' and e.oficio = 'director' INSERT INTO EMP(EMP_NO, APELLIDO, OFICIO, DIR, FECHA_ALT, SALARIO, COMISION, DEPT_NO) VALUES(9990,'JULIAN ROMERAL','EMPLEADO',7698,GETDATE(),80000,80000 * 0.15,30) INSERT INTO EMP(EMP_NO, APELLIDO, OFICIO, DIR, FECHA_ALT, SALARIO, COMISION, DEPT_NO) VALUES(9991,'LUIS ALONSO','VENTAS',7698,GETDATE(),80000,80000 * 0.15,30) SELECT * FROM EMP

30

SQL Server 2008 | 20/12/2011

5) Modificar la Comision de los empleados de la empresa, de forma que todos tengan un incremento del 10% update emp set comision = comision +(salario * 0.1)

1)

Create procedure CantEmpXDept @ndept int as select dept_no as Departamento,count(*)as empeados from emp group by dept_no having dept_no =@ndept --ejecutando exec CantEmpXDept 10

31

SQL Server 2008 | 20/12/2011

Create procedure AgregarEmpleado @Emp_No int, @Apellido nvarchar (50), @Oficio nvarchar (50), @Dir int, @Fecha_Alt smalldatetime, @salario int, @Comision int, @Dept_no int as insert into emp values ( @Emp_No,@Apellido,@Oficio,@Dir, @Fecha_Alt,@salario,@comision, @Dept_no)

exec AgregarEmpleado 999, 'Juana Perez', 'Director', 7839, '2011/12/18', 200000, 50000, 10

create procedure CantEmpXDept @ndept int as select dept_no as Departamento,count(*)as empeados from emp group by dept_no having dept_no =@ndept --ejecutando exec CantEmpXDept 10

6) Crear un Trigger en la tabla plantilla. Cuando actualicemos la tabla plantilla, debemos comprobar que el hospital que actualizamos existe, si intentamos actualizar el cdigo de hospital, no podremos hacerlo si no existe relacin con algn cdigo de hospital. Realizar el mismo Trigger para las tablas relacionadas con Hospital. SQL Server 2008 | 20/12/2011 Create trigger ActualizarPlantilla on Plantilla for update as declare @Hospital int Select @Hospital = i.hospital_cod from hospital as h inner join inserted as I on h.hospital_cod = i.hospital_cod if (@Hospital is null) begin print 'No Existe el codigo de Hospital' update Plantilla set Hospital_cod = d.hospital_cod from Plantilla as h , inserted as i, deleted as d where h.hospital_cod = i.hospital_cod end Else print 'Existe el codigo en el hospital'

7) Modificar el Trigger del ejercicio 4, utilizando transacciones y control de errores, si la operacin es correcta, mostrar un mensaje positivo, si la operacin no es correcta mostrar el error y un mensaje que indique que no se ha llevado a cabo la operacin. ALTER Trigger DARALTA on Emp For Insert as Declare @Error int Begin tran Insert into ControlTrigger (N_emp, Usuario, Fecha, Operacin) Select inserted.emp_no,user_name(),GetDate(),'INSERCION' From Inserted Set @Error =@ERROR if @Error<> 0 Begin Rollback tran print 'Existe un error en el Trigger' print @Error end else begin commit tran print 'Empleado insertado correctamente' end

8) Crear un Trigger que guarde los datos en la tabla ControlTrigger cuando se realice la baja de un empleado. Create Trigger DARBAJA on EMP For Delete As Insert Into ControlTrigger(N_EMP,USUARIO,FECHA,OPERACION) Select Deleted.emp_no,USER_NAME(),GETDATE(),'BAJA' From Deleted

9) Crear un Trigger que guarde los datos en la tabla ControlTrigger cuando se realice una modificacin en un empleado. Guardar la hora de la actualizacin en un campo aparte en la tabla ControlTrigger. (Aadir un campo) Create Trigger ModificarEmp on Emp For Update As DECLARE @HORA NVARCHAR(10) SET @HORA =convert(char(2),

SQL Server 2008 | 20/12/2011

datepart(hh,getdate())) + ':' +convert(char(2),datepart(mi,getdate())) + ':' +convert(char(2),datepart(ss,getdate())) Insert Into ControlTrigger(N_EMP,USUARIO,FECHA,OPERACION,HORA) Select Deleted.emp_no,User_Name(),GetDate(),'MODIFICACION',@HORA from Deleted, Inserted where deleted.emp_no = inserted.emp_no

10) Borrar todos los Triggers creados despus de haber sido probados y volver a dejar la base de datos como estaba desde la copia de seguridad. DROP TRIGGER.......

SQL Server 2008 | 20/12/2011

Anda mungkin juga menyukai