Está en la página 1de 4

Ejercicios Administrador de Base de Datos SQLSERVER2005

1. Crear la tabla de Gastos para guardar en ella los gastos de un cliente durante su estancia en el
Hotel.
a. Tabla de Gastos (IdGasto clave primaria, identity)

Gastos
Nombre Columna Tipo de Dato Valores Posibles Descripcin
IdGasto Entero Autonumrico Identificador de Registro
Num_admision Entero No Nulo Numero de Admisin
Cod_Cliente Entero No Nulo Cdigo de Cliente
Tipo_Tarifa Entero No Nulo Tipo de Tarifa
Fec_gasto Fecha No Nulo Fecha del Gasto
Cod_Grupo Entero No Nulo Cdigo de Grupo
Cod_Servicio Entero No Nulo Cdigo de Servicio
Cantidad Decimal(6,2) No Nulo Cantidad
Precio Decimal (12,2) No Nulo Precio

--------------------------------------------------------------
-- Gastos
--------------------------------------------------------------
CREATE TABLE Gastos
(
IdGasto int Identity(1,1) primary key,
num_admision int not null,
cod_cliente int not null,
tipo_tarifa int not null,
fec_gasto datetime not null,
cod_grupo int not null,
cod_servicio int not null,
cantidad decimal(6,2) not null,
precio decimal(12,2) not null
);

2. Crear las relaciones de esta tabla con las siguientes tablas:


a. Admisiones d.AgrupaSer
b. Clientes e.Servicios
c. Tipos de Tarifa f. Tarifas
3. Insertar datos en la tabla para cada uno de los clientes alojados en el hotel:
Insertar Estancia en habitacin Normal para cada uno de los das (hasta alcanzar la fecha
prevista de Salida)
Insertar Consumos del Minibar
Insertar Actividades Deportivas

--------------------------------------------------------------
-- Cliente 1
--------------------------------------------------------------
insert into Gastos
(num_admision,cod_cliente,tipo_tarifa,fec_gasto,cod_grupo,cod_
servicio,cantidad,precio)
values
(3, 1, 1, '03/12/2010', 1, 1, 1, 49.61);
insert into Gastos
(num_admision,cod_cliente,tipo_tarifa,fec_gasto,cod_grupo,cod_
servicio,cantidad,precio)
values
(3, 1, 1, '04/12/2010', 1, 1, 1, 49.61);
insert into Gastos
(num_admision,cod_cliente,tipo_tarifa,fec_gasto,cod_grupo,cod_
servicio,cantidad,precio)
values
(3, 1, 1, '05/12/2010', 1, 1, 1, 49.61);
insert into Gastos
(num_admision,cod_cliente,tipo_tarifa,fec_gasto,cod_grupo,cod_
servicio,cantidad,precio)
values
(3, 1, 1, '06/12/2010', 1, 1, 1, 49.61);
insert into Gastos
(num_admision,cod_cliente,tipo_tarifa,fec_gasto,cod_grupo,cod_
servicio,cantidad,precio)
values
(3, 1, 1, '07/12/2010', 1, 1, 1, 49.61);

insert into Gastos


(num_admision,cod_cliente,tipo_tarifa,fec_gasto,cod_grupo,cod_
servicio,cantidad,precio)
values
(3, 1, 1, '03/12/2010', 2, 1, 3, 3.31);

--------------------------------------------------------------
-- Cliente 2
--------------------------------------------------------------
insert into Gastos
(num_admision,cod_cliente,tipo_tarifa,fec_gasto,cod_grupo,cod_
servicio,cantidad,precio)
values
(4, 2, 1, '10/01/2011', 1, 1, 1, 49.61);
insert into Gastos
(num_admision,cod_cliente,tipo_tarifa,fec_gasto,cod_grupo,cod_
servicio,cantidad,precio)
values
(4, 2, 1, '11/01/2011', 1, 1, 1, 49.61);
insert into Gastos
(num_admision,cod_cliente,tipo_tarifa,fec_gasto,cod_grupo,cod_
servicio,cantidad,precio)
values
(4, 2, 1, '12/01/2011', 1, 1, 1, 49.61);
insert into Gastos
(num_admision,cod_cliente,tipo_tarifa,fec_gasto,cod_grupo,cod_
servicio,cantidad,precio)
values
(4, 2, 1, '13/01/2011', 1, 1, 1, 49.61);
insert into Gastos
(num_admision,cod_cliente,tipo_tarifa,fec_gasto,cod_grupo,cod_
servicio,cantidad,precio)
values
(4, 2, 1, '14/01/2011', 1, 1, 1, 49.61);
insert into Gastos
(num_admision,cod_cliente,tipo_tarifa,fec_gasto,cod_grupo,cod_
servicio,cantidad,precio)
values
(4, 2, 1, '15/01/2011', 1, 1, 1, 49.61);
insert into Gastos
(num_admision,cod_cliente,tipo_tarifa,fec_gasto,cod_grupo,cod_
servicio,cantidad,precio)
values
(4, 2, 1, '11/01/2011', 2, 1, 3, 3.31)

4. Crear un ndice no agrupado por Fecha de Gasto, Otro ndice por Admisin y Otro ndice por
Cliente.

CREATE INDEX i_fec_gasto ON Gastos (fec_gasto)


CREATE INDEX i_num_admision ON Gastos (num_admision) NO CREAR (Se va
a borrar de esta tabla y se va a insertar en SALIDAS)
CREATE INDEX i_fec_gasto ON Gastos (cod_cliente)

5. Modificar la cantidad de uno de los gastos aumentndola en 1.

UPDATE Gastos
set cantidad = cantidad + 1
where idgasto = 18

6. Borrar uno de los Gastos de Minibar del Cliente 2

DELETE Gastos
WHERE idgasto = 20

DELETE Gastos
WHERE Cod_cliente = 2
AND cod_grupo = 2
and cod_servicio = 1

7. Seleccionar el importe total acumulado por Cliente de la tabla de Gastos (Cantidad * Precio), no
es necesario enlazar con otras tablas para sacar el nombre, descripcin del gasto, etc.. Slo de
la tabla de Gastos.

SELECT cod_cliente, SUM(CANTIDAD*PRECIO)


FROM Gastos
GROUP BY cod_cliente
ORDER BY SUM(CANTIDAD*PRECIO) DESC
8. Dar salida al Cliente 2 empleando Transacciones. Dentro de la transaccin debemos incluir las
siguientes operaciones:
a. Borrar de Admisiones
b. Liberar habitacin
c. Insertar en Salidas

Nota: Tened en cuenta que si no lo metis en una transaccin y os da error en el punto a, se


habr borrado de la tabla de Admisiones y no habr forma de recuperarlo.

BEGIN TRANSACTION;
DELETE FROM Admisiones
WHERE cod_cliente = 2;
UPDATE Habitaciones
SET estado_habitacion = 'L'
where num_planta = 1
and num_habitacion = 3;
INSERT INTO Salidas
(num_admision, cod_cliente, num_planta, num_habitacion, fec_entrada,
fec_prev_salida, fec_salida, num_reserva)
VALUES
(4, 2, 1, 3, '10/01/2011', '15-01-2011', '16-01-2011', NULL);
COMMIT TRANSACTION;

Nota: En caso de error por restricciones de tabla, la sentencia se ejecuta completa, dejando la
BD inconsistente.

9. Seleccionar el Cliente que lleva ms Importe Gastado, sacar los siguientes datos:
a. Cdigo del Cliente
b. Nombre del Cliente
c. Importe Gastado

select cod_cliente, sum(cantidad*precio)


from Gastos
group by cod_cliente
order by sum(cantidad*precio) desc

Resultado:
2 297.6600
1 261.2900

Nota: No hay una instruccin que permita seleccionar el primer registro unicamente, para
ello hay que utilizar programacin con cursores.

10. Contar el total de Clientes que estuvieron en el hotel durante el mes de Diciembre.

select count(distinct cod_cliente)


from Salidas
where year(fec_entrada) = 2010
and month(fec_entrada) = 12
;
select count(*)
from Salidas
where year(fec_entrada) = 2010
and month(fec_entrada) = 12

11. Qu herramientas utilizamos para la Optimizacin de la Base de Datos en cuanto al


rendimiento? SQL SERVER PROFILER y Asistente para la Optimizacin de la Base de Datos.