Está en la página 1de 5

JESUS DAVID FERNANDEZ FUENTES

IVAN CAMILO ROSALES RODRIGUEZ

CODIGO UTILIZADO MODELO ER

-- -----------------------------------------------------
-- Table `Cliente`
-- -----------------------------------------------------
CREATE TABLE SYSTEM.CLIENTE(
ID_CLIENTE VARCHAR2(15) NOT NULL,
NOMBRE_CLI VARCHAR2(50) NOT NULL,
APELLIDO1_CLI VARCHAR2(50) NOT NULL,
APELLIDO2_CLI VARCHAR2(50) NULL,
FECHA_NAC_CLI TIMESTAMP DEFAULT TRUNC(SYSDATE) NOT NULL,
EDAD_CLI NUMBER(3,0) NOT NULL CHECK(EDAD_CLI >=18) ,
NOTA VARCHAR(45) NOT NULL,
CONSTRAINT PK_CLIENTE PRIMARY KEY ("ID_CLIENTE")
)TABLESPACE DATA_TX;
CREATE INDEX SYSTEM.INDEX_APELLIDO1_CLI ON SYSTEM.CLIENTE ("APELLIDO1_CLI");
-- -----------------------------------------------------
-- Table `Obligacion`
-- -----------------------------------------------------
CREATE TABLE SYSTEM.OBLIGACION (
ID_OBLIGACION VARCHAR2(15) NOT NULL,
PRODUCTO VARCHAR2(50) NOT NULL,
SALDO_CAPITAL NUMBER(10,2) NOT NULL,
SALDO_MORA NUMBER(10,2) NOT NULL,
INTERESES_CORRIENTES NUMBER(6,2) NOT NULL,
INSTERESES_MORA NUMBER(6,2) NOT NULL,
DIAS_MORA NUMBER DEFAULT 0 NOT NULL CHECK(DIAS_MORA >=0),
CONSTRAINT PK_OBLIGACION PRIMARY KEY ("ID_OBLIGACION")
)TABLESPACE DATA_TX;
CREATE INDEX SYSTEM.INDEX_PRODUCTO ON SYSTEM.OBLIGACION ("PRODUCTO");

-- -----------------------------------------------------
-- table `relacion_cli_obli`
-- -----------------------------------------------------
CREATE TABLE SYSTEM.RELACION_CLI_OBLI(
ID_OBLIGACION VARCHAR2(15) NOT NULL,
ID_CLIENTE VARCHAR2(15) NOT NULL,
TIPO VARCHAR2(8) NOT NULL,
CONSTRAINT PK_RELACION_CLI_OBLI PRIMARY KEY ("ID_OBLIGACION","ID_CLIENTE","TIPO"),
CONSTRAINT FK_CLIENTE FOREIGN KEY ("ID_CLIENTE") REFERENCES SYSTEM.CLIENTE ("ID_CLIENTE") ON
DELETE CASCADE,
CONSTRAINT FK_OBLIGACION FOREIGN KEY ("ID_OBLIGACION") REFERENCES SYSTEM.OBLIGACION
("ID_OBLIGACION") ON DELETE CASCADE
)TABLESPACE DATA_TX;
CREATE INDEX SYSTEM.INDEX_TIPO_CLI ON SYSTEM.RELACION_CLI_OBLI ("TIPO");

PREGUNTAS

1. Se desea conocer los clientes que tienen obligaciones TC, que su saldo capital supera el valor promedio de este
producto Generar un informe por cliente, en el que se evidencie el porcentaje de participación del saldo sobre el
total de la cartera

2. Generar un informe anual (utilice la fecha de actualización y/o fecha de desembolso), en el que se evidencie con
periodicidad mensual el saldo de cada producto y su porcentaje de participación.

Investigar: Hacer la consulta utilizando la cláusula over y sin utilizar la cláusula over (indicar cuál es la diferencia.)

3. Se desea conocer de los clientes multiproducto, con saldo saldo capital consolidado mayor a 30 millones de pesos,
su nombre, el Total de Obligaciones, y el valor de la mínima obligación y el valor de la máxima obligación donde es
deudor.

SELECT A.NOMBRE_CLIENTE,A.CUANTOS, A.MINIMO, A.MAXIMO


FROM
(

1
JESUS DAVID FERNANDEZ FUENTES
IVAN CAMILO ROSALES RODRIGUEZ
SELECT C.NOMBRE_CLIENTE, COUNT(O.ID_OBLIGACION) AS CUANTOS, MIN(O.SALDO_CAPITAL) AS
MINIMO, MAX(O.SALDO_CAPITAL) AS MAXIMO
FROM CLIENTE AS C
INNER JOIN RELACION AS REL ON REL.ID_CLIENTE=C.ID_CLIENTE AND REL.TIPO='DEUDOR'
INNER JOIN OBLIGACION AS O ON O.ID_OBLIGACION=REL.ID_OBLIGACION
GROUP BY C.NOMBRE_CLIENTE
) AS A
INNER JOIN
( SELECT C.NOMBRE_CLIENTE, SUM(O.SALDO_CAPITAL) AS SUMA
FROM CLIENTE AS C
INNER JOIN RELACION AS REL ON REL.ID_CLIENTE=C.ID_CLIENTE AND REL.TIPO='DEUDOR'
INNER JOIN OBLIGACION AS O ON O.ID_OBLIGACION=REL.ID_OBLIGACION
GROUP BY C.NOMBRE_CLIENTE
) AS B
ON A.NOMBRE_CLIENTE=B.NOMBRE_CLIENTE AND B.SUMA>3000000 AND A.CUANTOS>1
GROUP BY A.NOMBRE_CLIENTE

4. Se desea conocer por ciclo de mora el porcentaje de participación en Saldo Capital, de toda la cartera del banco.

Ciclo de Mora | Dias de Mora


Ciclo 1 1 - 30
Ciclo 2 31-60
Ciclo 3 61 – 90
Ciclo 4 91 – 120
Ciclo 5 121 – 150
Ciclo 6 151 – 180
Ciclo 7 mayor a 180

SELECT
CASE
WHEN DIAS_MORA BETWEEN 1 AND 30 THEN ‘CICLO 1’
WHEN DIAS_MORA BETWEEN 31 AND 60 THEN ‘CICLO 2’
WHEN DIAS_MORA BETWEEN 61 AND 90 THEN ‘CICLO 3’
WHEN DIAS_MORA BETWEEN 91 AND 120 THEN ‘CICLO 4’
WHEN DIAS_MORA BETWEEN 121 AND 150 THEN ‘CICLO 5’
WHEN DIAS_MORA BETWEEN 151 AND 180 THEN ‘CICLO 6’
WHEN DIAS_MORA > 180 THEN ‘CICLO6’
END
FROM SYSTEM.OBLIGACIONES;

5. Se desea conocer por cliente el total de obligaciones que tiene de cada producto

SELECT C.ID_CLIENTE, C.NOMBRE_CLIENTE ,O.PRODUCTOS, COUNT(O.PRODUCTOS) AS


NUM_OBLIGACIONES
FROM CLIENTE AS C
INNER JOIN RELACION AS REL ON REL.ID_CLIENTE=C.ID_CLIENTE
INNER JOIN OBLIGACION AS O ON O.ID_OBLIGACION=REL.ID_OBLIGACION
GROUP BY O.PRODUCTOS, C.ID_CLIENTE
ORDER BY C.ID_CLIENTE

6. Se desea conocer los clientes de tipo Deudor, que tienen tarjeta de credito pero no tienen creditos hipotecarios
(utilizar una consulta escalar (subquery), minus y/o Exists)

SELECT C.NOMBRE_CLI
FROM SYSTEM.CLIENTE C JOIN SYSTEM.RELACION_CLI_OBLI R
ON (C.ID_CLIENTE=R.ID_CLIENTE) AND R.TIPO='DEUDOR'
JOIN SYSTEM.OBLIGACION O
ON (R.ID_OBLIGACION=O.ID_OBLIGACION)
WHERE O.PRODUCTO='TARJETA CREDITO' AND NOT EXISTS (
SELECT * FROM SYSTEM.OBLIGACION OBLI JOIN
SYSTEM.RELACION_CLI_OBLI RCO
ON (RCO.ID_OBLIGACION=OBLI.ID_OBLIGACION) AND
R.TIPO='CRED HIPOTECARIO'
WHERE OBLI.ID_OBLIGACION=O.ID_OBLIGACION
);

2
JESUS DAVID FERNANDEZ FUENTES
IVAN CAMILO ROSALES RODRIGUEZ

7. Generar un informe por cliente, en el que se evidencie el porcentaje de participación del saldo sobre el total de la
cartera

SELECT C.ID_CLIENTE,SUM(O.SALDO_CAPITAL) "SALDO CAPITAL", (SUM(O.SALDO_CAPITAL)/(SELECT


SUM(SALDO_CAPITAL) FROM SYSTEM.OBLIGACION)*100) "% PARTICIPACION"
FROM SYSTEM.OBLIGACION O JOIN SYSTEM.RELACION_CLI_OBLI R
ON (R.ID_OBLIGACION=O.ID_OBLIGACION)
JOIN SYSTEM.CLIENTE C
ON (C.ID_CLIENTE=R.ID_CLIENTE)
GROUP BY C.ID_CLIENTE;

8. Hacer un informe en el cual se evidencien los clientes que son codeudores de obligaciones de Libre inversión, con
un saldo a capital menor a un salario mínimo legal vigente

SELECT C.ID_CLIENTE,C.NOMBRE_CLI,R.TIPO,O.SALDO_CAPITAL
FROM SYSTEM.CLIENTE C
INNER JOIN SYSTEM.RELACION_CLI_OBLI R ON R.ID_CLIENTE=C.ID_CLIENTE AND R.TIPO='COUDEUDOR'
INNER JOIN SYSTEM.OBLIGACION O ON O.ID_OBLIGACION=R.ID_OBLIGACION AND
O.PRODUCTO='MICROCREDITO' AND O.SALDO_CAPITAL<816000;

9. Indicar cuantas obligaciones y cuantos clientes hay por tipo de producto

SELECT O.PRODUCTO, COUNT(O.ID_OBLIGACION) AS "OBLIGACIONES", COUNT( DISTINCT


C.ID_CLIENTE) AS "CLIENTES"
FROM SYSTEM.CLIENTE C
INNER JOIN SYSTEM.RELACION_CLI_OBLI R ON R.ID_CLIENTE=C.ID_CLIENTE
INNER JOIN SYSTEM.OBLIGACION O ON O.ID_OBLIGACION=R.ID_OBLIGACION
GROUP BY O.PRODUCTO;

10. Se requiere conocer los clientes menores a 25 años, que tienen una tarjeta de crédito y tienen más de 30 días de
mora, para realizar un proceso masivo de bloqueo de TC.

SELECT C.NOMBRE_CLI, R.TIPO, O.PRODUCTO,O.DIAS_MORA


FROM SYSTEM.CLIENTE C JOIN SYSTEM.RELACION_CLI_OBLI R
ON (C.ID_CLIENTE=R.ID_CLIENTE) AND EDAD_CLI<25
JOIN SYSTEM.OBLIGACION O
ON (R.ID_OBLIGACION=O.ID_OBLIGACION) AND O.PRODUCTO='TARJETA CREDITO' AND
O.DIAS_MORA>30;

11. Listar los clientes que sean deudores de más de 2 obligaciones

SELECT C.NOMBRE_CLI, COUNT(O.ID_OBLIGACION) "NUM OBLIGACIONES" FROM


SYSTEM.CLIENTE C JOIN SYSTEM.RELACION_CLI_OBLI R
ON (C.ID_CLIENTE=R.ID_CLIENTE)
JOIN SYSTEM.OBLIGACION O
ON (R.ID_OBLIGACION=O.ID_OBLIGACION)
WHERE R.TIPO='DEUDOR'
GROUP BY C.NOMBRE_CLI
HAVING COUNT(O.ID_OBLIGACION)>=2;

12. Listar los clientes que sean codeudores de más de 3 obligaciones

SELECT C.NOMBRE_CLI, COUNT(O.ID_OBLIGACION) "NUM OBLIGACIONES" FROM


SYSTEM.CLIENTE C JOIN SYSTEM.RELACION_CLI_OBLI R
ON (C.ID_CLIENTE=R.ID_CLIENTE)
JOIN SYSTEM.OBLIGACION O
ON (R.ID_OBLIGACION=O.ID_OBLIGACION)
WHERE R.TIPO='CODEUDOR'

3
JESUS DAVID FERNANDEZ FUENTES
IVAN CAMILO ROSALES RODRIGUEZ
GROUP BY C.NOMBRE_CLI
HAVING COUNT(O.ID_OBLIGACION)>=3;

13. Calcule el valor promedio del saldo a capital por tipo de producto

SELECT O.PRODUCTO, COUNT(o.id_obligacion), sum(o.saldo_capital), AVG(o.saldo_capital)


FROM SYSTEM.CLIENTE C JOIN SYSTEM.RELACION_CLI_OBLI R
ON (C.ID_CLIENTE=R.ID_CLIENTE)
JOIN SYSTEM.OBLIGACION O
ON (R.ID_OBLIGACION=O.ID_OBLIGACION)
GROUP BY O.PRODUCTO;

14. Se desea conocer los clientes multiproducto (deudores con más de una obligación), que el máximo “días de mora”
de todas sus obligaciones su encuentre entre 30 y 60 días de mora.

SELECT A.ID_CLIENTE,A.NOMBRE_CLIENTE,A.APELLIDO_CLIENTE,A.DIAS,B.CUENTA
FROM
(
SELECT C.ID_CLIENTE,C.NOMBRE_CLIENTE,C.APELLIDO_CLIENTE, MAX(O.DIAS_MORA) AS DIAS
FROM CLIENTE AS C
INNER JOIN RELACION AS REL ON REL.ID_CLIENTE=C.ID_CLIENTE AND REL.TIPO='DEUDOR'
INNER JOIN OBLIGACION AS O ON O.ID_OBLIGACION=REL.ID_OBLIGACION AND (
SELECT MAX(O.DIAS_MORA) FROM OBLIGACION
) BETWEEN 30 AND 60
GROUP BY C.ID_CLIENTE
) AS A
INNER JOIN
(
SELECT C.ID_CLIENTE, COUNT(O.ID_OBLIGACION) AS CUENTA FROM CLIENTE AS C
INNER JOIN RELACION AS REL ON REL.ID_CLIENTE=C.ID_CLIENTE
INNER JOIN OBLIGACION AS O ON O.ID_OBLIGACION=REL.ID_OBLIGACION
GROUP BY C.ID_CLIENTE
) AS B
ON A.ID_CLIENTE=B.ID_CLIENTE AND B.CUENTA>1
GROUP BY A.ID_CLIENTE

15. Se desea conocer todos los clientes que tienen un producto Tarjeta de Crédito y que solo muestre el saldo a capital
de aquellos que tengan una mora mayor a 30 días de mora. Organizar el saldo capital ascendentemente

SELECT A.ID_CLIENTE,A.NOMBRE_CLIENTE,A.DIAS_MORA,
( CASE WHEN A.DIAS_MORA<30
THEN '-'
ELSE A.SALDO_CAPITAL END) AS SALDO
FROM
(
SELECT C.ID_CLIENTE,C.NOMBRE_CLIENTE,O.DIAS_MORA,O.SALDO_CAPITAL
FROM CLIENTE AS C
INNER JOIN RELACION AS REL ON REL.ID_CLIENTE=C.ID_CLIENTE
INNER JOIN OBLIGACION AS O ON O.ID_OBLIGACION=REL.ID_OBLIGACION AND
O.PRODUCTOS='TARJETA CREDITO'
GROUP BY C.ID_CLIENTE
) AS A
GROUP BY A.ID_CLIENTE

16. Se quiere conocer todos los productos del banco que están al día (con cero días de mora), indicando el saldo capital
consolidado solo de los productos que tienen más de 6 clientes tipo deudores.

SELECT A.PRODUCTOS,
CASE WHEN B.CUANTAS<6
THEN '-'
ELSE B.SUMA END

4
JESUS DAVID FERNANDEZ FUENTES
IVAN CAMILO ROSALES RODRIGUEZ
FROM
(
SELECT O.PRODUCTOS
FROM OBLIGACION AS O
INNER JOIN RELACION AS REL ON REL.ID_OBLIGACION=O.ID_OBLIGACION
INNER JOIN CLIENTE AS C ON C.ID_CLIENTE=REL.ID_CLIENTE AND O.DIAS_MORA=0
GROUP BY O.PRODUCTOS
) AS A
INNER JOIN
(
SELECT O.PRODUCTOS, COUNT(O.ID_OBLIGACION) AS CUANTAS,SUM(O.SALDO_CAPITAL) AS SUMA
FROM OBLIGACION AS O
INNER JOIN RELACION AS REL ON REL.ID_OBLIGACION=O.ID_OBLIGACION AND
REL.TIPO='DEUDOR'
INNER JOIN CLIENTE AS C ON C.ID_CLIENTE=REL.ID_CLIENTE AND O.DIAS_MORA=0
GROUP BY O.PRODUCTOS
) AS B

ON B.PRODUCTOS=A.PRODUCTOS
GROUP BY A.PRODUCTOS