Este documento presenta 14 ejercicios sobre consultas SQL que involucran joins y funciones. Los ejercicios piden listar empleados, extractos contables, personas que son tanto clientes como empleados, aumentos salariales, listados de personas y localidades, fechas futuras y pasadas, y uniones de tablas de personas y empleados. Las consultas usan funciones como NEXT_DAY, LAST_DAY, MONTHS_BETWEEN, TRUNC, ROUND y operaciones como JOINs, OUTER JOINs, INTERSECT y MINUS.
Industria musical de EUA vs Industria musical Corea del Sur (2024).pdf
Bd2 ejer02 joins y funciones_solucion
1. Universidad Nacional de Asunción – Facultad Politécnica
Carrera: CIENCIAS INFORMÁTICAS Año 2012
Materia: BASE DE DATOS II Semestre Quinto Sección A-B-I
EJERCICIO 2 JOINS y FUNCIONES
1. Obtenga la lista de empleados con su posición y salario vigente (El salario y la categoría
vigente tienen la fecha fin nula – Un solo salario está vigente en un momento dado). Debe
listar:
Nombre área, Apellido y nombre del empleado, Fecha Ingreso, categoría, salario actual
La lista debe ir ordenada por nombre de área, y por apellido del funcionario.
select A.NOMBRE_AREA, E.APELLIDO||', '||E.NOMBRE "APELLIDO Y NOMBRE",
E.FECHA_ING,
P.COD_CATEGORIA, S.ASIGNACION
FROM B_POSICION_ACTUAL P, B_AREAS A, B_EMPLEADOS E,
B_CATEGORIAS_SALARIALES S
WHERE A.ID = P.ID_AREA
AND E.CEDULA = P.CEDULA
AND S.COD_CATEGORIA = P.COD_CATEGORIA
AND S.FECHA_FIN IS NULL
AND P.FECHA_FIN IS NULL
ORDER BY 1, 2
/
2. Liste el libro DIARIO correspondiente al mes de enero del año 2012, tomando en cuenta la
cabecera y el detalle. Debe listar los siguientes datos:
ID_Asiento, Fecha, Concepto, Nro.Linea, código cuenta, nombre cuenta, Monto débito,
Monto crédito (haga aparecer el monto del crédito o débito según el valor del campo
débito_crédito – D ó C)
SELECT C.ID ID_ASIENTO, C.CONCEPTO, C.FECHA,D.NRO_LINEA,
D.CODIGO_CTA, M.NOMBRE_CTA, DECODE(D.DEBE_HABER, 'D', IMPORTE, 0) DEBITO,
DECODE(D.DEBE_HABER, 'C', IMPORTE, 0) CREDITO
FROM B_DIARIO_DETALLE D, B_DIARIO_CABECERA C, B_CUENTAS M
WHERE C.FECHA BETWEEN TO_DATE('01012012','DDMMYYYY') AND
TO_DATE('31012012','DDMMYYYY')
AND D.ID = C.ID
AND M.CODIGO_CTA = D.CODIGO_CTA;
3. Algunos empleados de la empresa son también clientes. Obtenga dicha lista a través de una
operación de intersección. Liste cédula, nombre y apellido, teléfono. Tenga en cuenta sólo a
las personas físicas (F) que tengan cédula. Recuerde que los tipos de datos para operaciones
del álgebra relacional tienen que ser los mismos.
SELECT LPAD(P.CEDULA,15,0) CEDULA, P.APELLIDO, P.NOMBRE, P.TELEFONO
FROM B_PERSONAS P
WHERE ES_CLIENTE = 'S'
AND P.CEDULA IS NOT NULL
AND P.TIPO_PERSONA = 'F'
INTERSECT
SELECT LPAD(TO_CHAR(E.CEDULA), 15,0) CEDULA, E.APELLIDO, E.NOMBRE,
E.TELEFONO
FROM B_EMPLEADOS E;
4. Se pretende realizar el aumento salarial del 5% para todas las categorías. Debe listar la
categoría (código y nombre), el importe actual, el importe aumentado al 5% (redondeando la
cifra a la centena), y la diferencia.
Formatee la salida para que los montos tengan los puntos de mil.
COLUMN ASIGNACION FORMAT 99G999G999
COLUMN AUMENTADO FORMAT 99G999G999
COLUMN DIFERENCIA FORMAT 99G999G999
SELECT COD_CATEGORIA, NOMBRE_CAT, ASIGNACION,
ROUND(ASIGNACION*1.05, -2) AUMENTADO, ROUND(ASIGNACION*1.05, -2) -
ASIGNACION DIFERENCIA
FROM B_CATEGORIAS_SALARIALES;
1/4
2. Universidad Nacional de Asunción – Facultad Politécnica
Carrera: CIENCIAS INFORMÁTICAS Año 2012
Materia: BASE DE DATOS II Semestre Quinto Sección A-B-I
EJERCICIO 2 JOINS y FUNCIONES
5. Se necesita tener la lista completa de personas (independientemente de su tipo), ordenando
por nombre de localidad. Si la persona no tiene asignada una localidad, también debe
aparecer. Liste Nombre de Localidad, Nombre y apellido de la persona, dirección, teléfono
SELECT L.NOMBRE, P.NOMBRE||', '||P.APELLIDO "NOMBRE Y APELLIDO",
P.DIRECCION,
P.TELEFONO
FROM B_PERSONAS P, B_LOCALIDAD L
WHERE L.ID (+) = P.ID_LOCALIDAD;
O bien
SELECT L.NOMBRE, P.NOMBRE||', '||P.APELLIDO "NOMBRE Y APELLIDO",
P.DIRECCION,
P.TELEFONO
FROM B_PERSONAS P LEFT OUTER JOIN B_LOCALIDAD L
ON L.ID = P.ID_LOCALIDAD;
6. En base a la consulta anterior, liste todas las localidades, independientemente que existan
personas en dicha localidad:
SELECT L.NOMBRE, P.NOMBRE||', '||P.APELLIDO "NOMBRE Y APELLIDO",
P.DIRECCION,
P.TELEFONO
FROM B_PERSONAS P, B_LOCALIDAD L
WHERE L.ID = P.ID_LOCALIDAD (+);
O bien
SELECT L.NOMBRE, P.NOMBRE||', '||P.APELLIDO "NOMBRE Y APELLIDO",
P.DIRECCION,
P.TELEFONO
FROM B_PERSONAS P RIGHT OUTER JOIN B_LOCALIDAD L
ON L.ID = P.ID_LOCALIDAD;
7. Obtenga la misma lista del ejercicio 5, pero asegurándose de listar todas las personas,
independientemente que estén asociadas a una localidad, y todas las localidades, aún cuando
no tengan personas asociadas:
SELECT L.NOMBRE, P.NOMBRE||', '||P.APELLIDO "NOMBRE Y APELLIDO",
P.DIRECCION,
P.TELEFONO
FROM B_PERSONAS P FULL OUTER JOIN B_LOCALIDAD L
ON L.ID = P.ID_LOCALIDAD;
8. Considerando la fecha de hoy, indique cuándo caerá el próximo DOMINGO.
SELECT NEXT_DAY (SYSDATE, 'DOMINGO') FROM dual
/
9. Suponiendo que estamos el 1 de Febrero del 2012, utilice la función LAST_DAY para
determinar si este año es bisiesto o no. Con CASE y con DECODE, haga aparecer la
expresión ‘bisiesto’ o ‘no bisiesto’ según corresponda. Pruebe con el 1 de Febrero del 2014.
SELECT DECODE(TO_CHAR(LAST_DAY(TO_DATE('01-02-2012','DD-MM-YYYY')),
'DD'),
29, 'BISIESTO', 'NO BISIESTO')
ES_BISIESTO FROM DUAL;
SELECT
2/4
3. Universidad Nacional de Asunción – Facultad Politécnica
Carrera: CIENCIAS INFORMÁTICAS Año 2012
Materia: BASE DE DATOS II Semestre Quinto Sección A-B-I
EJERCICIO 2 JOINS y FUNCIONES
CASE TO_CHAR(LAST_DAY(TO_DATE('01-02-2012','DD-MM-YYYY')), 'DD')
WHEN '29' THEN 'BISIESTO'
ELSE 'NO BISIESTO'
END ES_BISIESTO
FROM DUAL;
10. Tomando en cuenta la fecha de hoy, verifique que fecha dará redondeando al año? Y
truncando al año? Escriba el resultado. Pruebe lo mismo suponiendo que sea el 1 de Julio del
año. Pruebe también el 12 de marzo.
SELECT ROUND(SYSDATE, 'YYYY') AÑO FROM DUAL;
SELECT TRUNC(SYSDATE, 'YYYY') AÑO FROM DUAL;
SELECT ROUND(TO_DATE('01-07-2012','DD-MM-YYYY'),'YYYY') AÑO FROM DUAL;
SELECT TRUNC(TO_DATE('01-07-2012','DD-MM-YYYY'),'YYYY') AÑO FROM DUAL;
SELECT ROUND(TO_DATE('12-03-2012','DD-MM-YYYY'),'YYYY') AÑO FROM DUAL;
SELECT TRUNC(TO_DATE('12-03-2012','DD-MM-YYYY'),'YYYY') AÑO FROM DUAL;
11. Imprima su edad en años y meses. Ejemplo: Si nació el 23/abril/1972, tendría 39 años y 9
meses a la fecha.
SELECT TRUNC(MONTHS_BETWEEN(SYSDATE, TO_DATE('23/04/1972',
'DD/MM/YYYY')) /12,0) || 'años y '
|| TRUNC(MOD(MONTHS_BETWEEN(SYSDATE, TO_DATE('23/04/1972',
'DD/MM/YYYY')), 12),0) || ' meses' Edad
FROM DUAL;
12. Determine la fecha y hora del sistema en el formato apropiado.
SELECT TO_CHAR(SYSDATE,'DD/MM/YYYY HH24:MI:SS') FROM DUAL;
13. Liste ID y NOMBRE de todos los artículos que no están incluidos en ninguna VENTA. Debe
utilizar necesariamente la sentencia MINUS.
SELECT ID, NOMBRE
FROM B_ARTICULOS
MINUS
SELECT
V.ID_ARTICULO, A.NOMBRE
FROM B_DETALLE_VENTAS V, B_ARTICULOS A
WHERE A.ID = V.ID_ARTICULO;
14. La organización ha decidido mantener un registro único de todas las personas, sean éstas
proveedores, clientes y/o empleados. Para el efecto se le pide una operación de UNION entre
las tablas de B_PERSONAS y B_EMPLEADOS. Debe listar
CEDULA, APELLIDO, NOMBRE, DIRECCION, TELEFONO, FECHA_NACIMIENTO.
En la tabla PERSONAS tenga únicamente en cuenta las personas de tipo FISICAS (F) y
que tengan cédula. Ordene la consulta por apellido y nombre
SELECT LPAD(P.CEDULA,15,0) CEDULA , APELLIDO, NOMBRE, DIRECCION,
TELEFONO
FROM B_PERSONAS P
WHERE P.TIPO_PERSONA = 'F'
AND P.CEDULA IS NOT NULL
UNION
SELECT LPAD(TO_CHAR(CEDULA), 15,0) , APELLIDO, NOMBRE, DIRECCION,
TELEFONO
FROM B_EMPLEADOS;
3/4
4. Universidad Nacional de Asunción – Facultad Politécnica
Carrera: CIENCIAS INFORMÁTICAS Año 2012
Materia: BASE DE DATOS II Semestre Quinto Sección A-B-I
EJERCICIO 2 JOINS y FUNCIONES
4/4