Este documento presenta 11 consultas realizadas en Oracle/PLSQL sobre datos de préstamos de libros de una universidad. La primera consulta lista estudiantes con préstamos atrasados. Las siguientes agregan cálculos de deuda, promedios, sumas y fechas futuras. Otras vistas resumen los préstamos máximos y mínimos. Las consultas finales cuentan préstamos por carrera y lista las 10 carreras con más préstamos.
1. UNIVERSIDAD AUSTRAL DE CHILE
FACULTAD DE CIENCIAS ECONÓMICAS Y ADMINISTRATIVAS
INSTITUTO DE ADMINISTRACIÓN
Laboratorio N° 2
Oracle / PLSQL
Alumna:
Nadia Muñoz B.
Asignatura:
Sistemas de Información Empresarial
Profesor: Ayudante:
Cristian Salazar C. José Luis Carrasco
Valdivia, 21 de mayo de 2012
2. 1.- Se solicita realizar una consulta que entregue a los estudiantes atrasados en la entrega de
sus préstamos de libros, e indicar la cantidad de días de atraso para cada préstamo. Los
campos a mostrar son: Rut del estudiante, Nombres, Apellidos y el N° de días de
atraso. Ayuda: Usar la fecha del sistema denominada por SYSDATE, y usar la
función TRUNC para quitar las horas, minutos y segundos de las fechas.
SELECT e.nombres,
e.apellidos,
e.rut_est,
p.fecha_E,
TRUNC (sysdate)-p.fecha_eAS "Nrodias atraso"
FROM estudiantes e, prestamo p
WHERE e.rut_est=p.rut_est
AND p.fecha_e<TRUNC(sysdate);
La consulta genera 291 resultados, de los cuales 10 se presentan a continuación:
2.- Si cada día efectivo de atraso tiene un valor de $1250, entregue los mismo que en (1),
pero agregando una nueva columna con la deuda adquirida por cada estudiante.
Ayuda: Para multiplicar se usa el *, entonces si se desea multiplicar A por B, sería A*B.
SELECT e.nombres,
e.apellidos,
e.rut_est,
p.fecha_E,
TRUNC (sysdate)-p.fecha_e AS "Nrodias atraso",
(TRUNC (sysdate)-p.fecha_e)*'1250' AS "Deuda"
3. FROMestudiantes e, prestamo p
WHEREe.rut_est=p.rut_est
ANDp.fecha_e<TRUNC(sysdate);
La consulta genera 291 resultados, de los cuales se muestran 10 a continuación:
3.- Entregue la suma de dinero que ganará la Biblioteca acumulada al día de hoy. Ayuda:
Para hacer la suma se usa la función SUM y la función GROUP BY.
SELECT SUM ((Trunc (sysdate)-p.fecha_e)*'1250') AS "Deuda acumulada"
FROM prestamo p
WHERE p.fecha_e<TRUNC (sysdate);
El resultado que arroja la consulta es el siguiente:
4.- Entregue el promedio de deuda que tienen los estudiantes al día de hoy. Ayuda: Para
calcular el promedio se usa la función AVG y la función GROUP BY.
SELECT AVG ((Trunc (sysdate)-p.fecha_e)*'1250') AS "Promedio deuda estudiantes"
FROM prestamo p
WHERE p.fecha_e<TRUNC (sysdate);
El resultado que arroja la consulta es el siguiente:
5.- Entregue la mínima deuda acumulada al día de hoy. Ayuda: Utilice la función MIN y la
función GROUP BY.
4. SELECT MIN ((Trunc (sysdate)-p.fecha_e)*'1250') AS "Minima deuda acumulada"
FROM prestamo p
WHERE p.fecha_e<TRUNC (sysdate);
La mínima deuda acumulada de los estudiantes, al día de hoy es la que se muestra a
continuación:
6.- Entregue la máxima deuda acumulada al día de hoy. Ayuda: utilice la función MAX y la
función GROUP BY.
SELECT MAX ((Trunc (sysdate)-p.fecha_e)*'1250') AS "Maxima deuda acumulada"
FROM prestamo p
WHERE p.fecha_e<TRUNC (sysdate);
La máxima deuda acumulada de los estudiantes, al día de hoy es la siguiente:
7.- Suponiendo que ninguno de los estudiantes que se encuentran con préstamo entrega sus
libros, cual será la deuda acumulada para 4 días más. Ayuda: Para sumar un días a una
fecha se hace de la siguiente forma: FECHA + N, donde N es la cantidad de días a sumar y
FECHA es la fecha a la cual le estamos sumandos días. Para el caso de la fecha de hoy,
sería SYSDATE + N.
SELECT SUM ((Trunc (sysdate+4)-p.fecha_e)*'1250') AS "Deuda acumulada 4 dias"
FROM prestamo p
WHERE p.fecha_e<TRUNC(sysdate+4);
La deuda acumulada para 4 días más sería la siguiente, si ninguno de los estudiantes
entregan sus libros para esa fecha:
8.- En su sistema de Base de Datos se encuentran 2 Vistas (Views), una llamada MAXIMO
y otra llamada MINIMO. Describa claramente que entregan cada una de ellas, haciendo
análisis de cada parte de la consulta. Ayuda: Busque información sobre Sub-Consultas.
5. La primera vista presentada en el sistema de Base de Datos es la siguiente:
create or replace view maximos as
selectp.rut_est RUT,
e.apellidos || ' ' || e.nombres NOMBRE,
l.titulo,
(trunc(sysdate) - trunc(p.fecha_e)) * 1250 as DIAS_ATRASO
fromprestamo p, estudiantes e, libros l
wheretrunc(p.fecha_e) <trunc(sysdate)
andp.rut_est = e.rut_est
andp.cod_libro = l.cod_libro
and (trunc(sysdate) - trunc(p.fecha_e)) = (select max(trunc(sysdate) - trunc(p2.fecha_e))
fromprestamo p2
wheretrunc(p2.fecha_e) <trunc(sysdate))
Esta vista corresponde a una consulta que entregue el RUT, los NOMBRES y APELLIDOS
(en una sola columna) del estudiante, el TITULO del libro prestado y la DEUDA que tiene
generada por los días de atraso. Para unir los nombres con los apellidos se utilizó || ' ' ||, así
en una sola columna aparecen tanto los nombres, como los apellidos. La deuda por los días
de atraso (que ahí se muestra como “DIAS_ATRASO”) está calculada haciendo la
diferencia o resta entre la fecha de hoy y la fecha de entrega del libro, multiplicado por el
valor de un día de atraso. Posteriormente, se aplican las restricciones correspondientes,
tales como la condición de préstamo atrasado indicada por “fecha de entrega es menor a la
fecha de hoy”, la igualación de PK y FK de las tablas utilizadas, y finalmente una
subconsulta(está entre paréntesis) que entrega la máxima cantidad de días de atraso. La
subconsulta se utiliza para filtrar la WHERE, haciendo que de todos los estudiantes que
tienen libros atrasados, sólo se muestre aquel estudiante que tiene la máxima deuda, ya que
tiene más días de atraso.
El resultado que genera la consulta es el siguiente:
La segunda vista es la siguiente:
6. create or replace view minimos as
selectp.rut_est RUT,
e.apellidos || ' ' || e.nombres NOMBRE,
l.titulo,
(trunc(sysdate) - trunc(p.fecha_e)) * 1250 as DIAS_ATRASO
fromprestamo p, estudiantes e, libros l
wheretrunc(p.fecha_e) <trunc(sysdate)
andp.rut_est = e.rut_est
andp.cod_libro = l.cod_libro
and (trunc(sysdate) - trunc(p.fecha_e)) = (select min(trunc(sysdate) - trunc(p2.fecha_e))
fromprestamo p2
wheretrunc(p2.fecha_e) <trunc(sysdate))
Esta vista es similar a la anterior. La diferencia está en que esta entrega como resultado a
los estudiantes cuya deuda es mínima, en este caso son aquellos que tienen el mínimo de
días de atraso (uno). De estos estudiantes se muestra su RUT, NOMBRES y APELLIDOS
en una sola columna, el TITULO del libro prestado, y la deuda generada por los días de
atraso en la entrega del libro. La vista de la consulta está estructurada igualmente que la
anterior, se diferencian sólo en que ésta corresponde al mínimo y la anterior al máximo.
Esta consulta genera 52 resultados cuya deuda es mínima, de ellos se presentan 10 a
continuación:
9.- Entregue el nombre de la carrera y la cantidad de estudiantes por cada una de ellas que
tiene libros atrasados. Ayuda: Use la función COUNT y la función GROUP BY.
SELECT car.nombre, count (p.rut_est)AS "EST_atrasados"
7. FROM carreras car, prestamo p, estudiantes e
WHERE car.id_carrera=e.id_carrera
AND e.rut_est=p.rut_est
AND TRUNC(sysdate)>p.fecha_e
GROUP BY car.nombre;
Esta tabla arroja 45 resultados, de los cuales 10 se muestran a continuación:
10.- Los mismo que en (9) pero esta vez que entregue la cantidad de estudiantes que tiene
un libro en préstamo ya sea atrasado o al día.
SELECT car.nombre, count (p.rut_est)AS "Prestamos"
FROM carreras car, prestamo p, estudiantes e
WHERE car.id_carrera=e.id_carrera
AND e.rut_est=p.rut_est
GROUPBY car.nombre;
La consulta arroja 45 resultados (de las 45 carreras) con los correspondientes préstamos que
tienen sus estudiantes. En este caso, la tabla coincide con la anterior puesto que a la fecha
de hoy (21 de mayo) todos los estudiantes se encontrarían con préstamos atrasados, es
decir, no existe alguno que esté al día. La tabla generada es la siguiente:
8. 11.- Investigue como entregar las 10 carreras que tienen mayor cantidad de libros en
préstamo. Ayuda: Se usa un tipo de función llamada ROWNUM y la función ORDER BY.
SELECT *
FROM (SELECT car.nombre, COUNT (p.rut_est)AS "Librosprestados"
FROM carreras car, estudiantes e, prestamo p
WHERE car.id_carrera=e.id_carrera
AND e.rut_est=p.rut_est
GROUP BY car.nombre
ORDER BY COUNT (p.rut_est) DESC)
WHERE ROWNUM<=10;
Las 10 carreras con mayor cantidad de libros prestados son las siguientes: