Está en la página 1de 8

BASES DE DATOS

PROYECTO

Laura Rivera Diaz


Ronald Torres
Daniel España

Profesor
Diego Alexander Moreno Rojas

Universidad Jorge Tadeo Lozano

Bogotá
12/05/2023
Después de su quinto años en operación la empresa quiere conmemorar a sus
clientes más fieles, y a los empleados que han venido apoyando todo el proceso,
para ello necesitan dos sabanas de datos que cumpla las siguientes reglas:

SABANA DE DATOS 1:

El resultado esperado es una tabla llamada clientes_alto_valor con los campos


id_cliente de tipo numérico, nombre del cliente de tipo texto, ciudad tipo texto, país
tipo texto, nombre_división tipo texto, categoría_cliente tipo texto, teléfono tipo
texto, indicativo tipo numérico (número que esta entre paréntesis, si la persona no
tiene indicativo colocar el valor -1).
1. Los clientes deben estar clasificados según la cantidad de compras que han
realizado en los 5 años, los rangos de clasificación están en la tabla
Categoria_Clientes, se debe completar el campo
ID_CATEGORIA_CLIENTE de la tabla Clientes.
// Código para llenar la columna ID_CATEGORIA de la tabla clientes
// se declara la variable id cliente y v_count

DECLARE
v_id_cliente cabecera_ordenes.id_cliente%TYPE;
v_count NUMBER;

// se inicia un For para iterar en la consulta seguido de un loop validando con un if si la cantidad de
compras esta en el rango establecido de la categoría, se actualiza la tabla clientes y se agrega el id
de la categoría respectiva
BEGIN
FOR i IN (SELECT id_cliente, COUNT(*) AS count FROM cabecera_ordenes GROUP BY
id_cliente ORDER BY id_cliente ASC)
LOOP
v_id_cliente := i.id_cliente;
v_count := i.count;
IF v_count BETWEEN 100 AND 150 THEN
UPDATE clientes SET id_categoria = '1' WHERE id_cliente = v_id_cliente;
ELSIF v_count BETWEEN 151 AND 200 THEN
UPDATE clientes SET id_categoria = '2' WHERE id_cliente = v_id_cliente;
ELSIF v_count BETWEEN 201 AND 250 THEN
UPDATE clientes SET id_categoria = '3' WHERE id_cliente = v_id_cliente;
ELSIF v_count BETWEEN 251 AND 300 THEN
UPDATE clientes SET id_categoria = '4' WHERE id_cliente = v_id_cliente;
ELSIF v_count > 300 THEN
UPDATE clientes SET id_categoria = '5' WHERE id_cliente = v_id_cliente;
ELSE
UPDATE clientes SET id_categoria = '0' WHERE id_cliente = v_id_cliente;
END IF;
END LOOP;
END;

2. Los clientes que realizaron al menos una compra por año desde el primer año
de apertura pasan a la base final.

// Se declara la variable v_id_cliente de la tabla cabecera

// Se inicia un For para iterar en la consulta se tiene en cuenta que para extraer el año
se utiliza la función extract en la columna fecha_orden y se agrupa id_cliente y se
omiten los registros duplicados con la función distinct y se muestra el id del cliente
que tenga 6 datos repetidos,
se utiliza un Loop para agregar los registros en la tabla clientes_alto_valor los datos
solicitados cuando la variable iterada coincide con el id_cliente

DECLARE
v_id_cliente CABECERA_ORDENES.ID_CLIENTE%TYPE;

BEGIN
FOR c IN (SELECT DISTINCT ID_CLIENTE
FROM CABECERA_ORDENES
WHERE EXTRACT(YEAR FROM TO_DATE(FECHA_ORDEN, 'MM/DD/YYYY')) BETWEEN 2018
AND 2023
GROUP BY ID_CLIENTE
HAVING COUNT(DISTINCT EXTRACT(YEAR FROM TO_DATE(FECHA_ORDEN,
'MM/DD/YYYY'))) = 6
ORDER BY ID_CLIENTE ASC) LOOP
v_id_cliente := c.ID_CLIENTE;
-- insertar en la tabla CLIENTES_ALTO_VALOR
INSERT INTO CLIENTES_ALTO_VALOR (ID_CLIENTE, NOMBRE_CLIENTE, CIUDAD, PAÍS,
NOMBRE_DIVISIÓN, CATEGORÍA_CLIENTE, TELÉFONO, INDICATIVO)
SELECT c.ID_CLIENTE, cl.NOMBRE_CLIENTE, cl.CIUDAD, cl.PAIS, dv.NOMBRE_DIVISION,
cat.CATEGORIA, cl.TELEFONO, cl.ID_CATEGORIA
FROM CLIENTES cl
INNER JOIN DIVISIONES dv ON cl.ID_DIVISION = dv.ID_DIVISION
INNER JOIN CATEGORIA_CLIENTES cat ON cl.ID_CATEGORIA = cat.ID_CATEGORIA
WHERE cl.ID_CLIENTE = v_id_cliente;
END LOOP;
END;

3. Los clientes que nos visitan desde otras ciudades se reconocen por que en su
número de teléfono utilizan el indicativo entre parénesis, si estos clientes
están en la categoría diamond pasan a la base final.

// se selecciona de la tabla cliente todos los registros cuyo teléfono inicie con
paréntesis y en el id de su categoría sea igual a 5
select * from clientes
where telefono like '(%' and id_categoria = '5';

4. Excluyendo los clientes que ya ingresaron en la base final, se premiaran a los


5 clientes por cada categoría generaron un margen de ganancias favorable.
SABANA DE DATOS 2:

El resultado esperado es una tabla llamada empleados_generan_valor, con los


campos id_empleado de tipo numérico, nombre_completo del empleado de tipo
texto, margen_ganancia de tipo numérico, peso_carga tipo numérico, mes tipo texto,
año tipo número, proveedor_nacional tipo texto, domonio_email_proveedor.

1. Los 15 empleados con mayor margen de ganancia mensual por año, teniendo
en cuenta las demás reglas.

2. Al calcular el margen de ganancia no se deben tener en cuenta los empleados


que tuvieron ventas de productos de los proveedores cuyo dominio de correo
no sea de una entidad valida (Gmail,Hotmail,outlook).

// Se selecciona los diferentes datos solicitados para poder iterar y así poder
hacer el respectivo calculo

DECLARE
CURSOR c_proveedores IS
SELECT id_proveedor, nit, proveedor, telefono, contacto_, correo_
FROM proveedores

// Se utiliza la función REGEXP_LIKE para seleccionar los proveedores


cuyas direcciones de correo electrónico no terminan en gmail.com,
hotmail.com o outlook.com. La expresión regular utilizada es
^[^@]+@(?!gmail\.com|hotmail\.com|outlook\.com)\w+\.\w+$, que se lee de
la siguiente manera:

WHERE REGEXP_LIKE(correo_,
'^[^@]+@(?!gmail\.com|hotmail\.com|outlook\.com)\w+\.\w+$')
AND id_proveedor = v_id_p AND nit = v_nit
AND proveedor = v_proveedor AND telefono = v_telefono
AND contacto_ = v_contacto AND correo_ = v_correo;
BEGIN
FOR r_proveedor IN c_proveedores LOOP
INSERT INTO proveedores_correo (id_proveedor, nit, proveedor, telefono, contacto_,
correo_)
VALUES (r_proveedor.id_proveedor, r_proveedor.nit, r_proveedor.proveedor,
r_proveedor.telefono, r_proveedor.contacto_, r_proveedor.correo_);
DBMS_OUTPUT.PUT_LINE('registros insertados ' || SQL%ROWCOUNT);
END LOOP;
COMMIT;
END;

3. Al calcular el margen de ganancia se deben omitir lo productos que se les


aplico más del 15 % de descuento.
// la cláusula WHERE filtra los registros donde el DESCUENTO y nos dice si es
menor o igual al 15%, lo que significa que los productos que se les aplicó más del
15% de descuento son omitidos en el cálculo del margen de ganancia

SELECT NRO_FACTURA, ID_PRODUCTO, CANTIDAD, DESCUENTO, PRECIO_UNITARIO,


VENTA_PRODUCTO, COSTO_PRODUCTO,

((VENTA_PRODUCTO-COSTO_PRODUCTO)/VENTA_PRODUCTO)*100 AS MARGEN

FROM DETALLE_ORDENES

WHERE DESCUENTO < 0.15;

4. En las ventas no se deben tener en cuenta los productos que corresponde a


una categoría de ropa ‘Clothes’.

// se selecciona id_categoria, nombre_categoria de la tabla categorías donde

select id_categoria,nombre_categoria from categorias


where nombre_categoria NOT LIKE '%Clothes%'

5. En la tabla debe estar el proveedor con el cual genero la mayor cantidad de


margen.
// se selecciona el número de factura y el id del producto, luego se utiliza una
subconsulta para obtener el id del proveedor del producto correspondiente y
finalmente se selecciona el margen de ganancia, al final se establece el
Where para filtrar los registros de la tabla detalle ordenes y mostrar el margen
de ganancias que sea mayor a 15

SELECT
d.nro_factura,
d.id_producto,
(SELECT p.id_proveedor FROM productos p WHERE p.id_producto = d.id_producto) AS
id_proveedor,
d.margen
FROM Detalle_Ordenes d
WHERE d.margen > 15;

6. Dejar el registro con mayor margen sin importar le año en el que fue generado.
// el código ejecuta una consulta en la tabla DETALLE_ORDENES y devuelve todas las filas
donde el valor de la columna MARGEN es igual al valor máximo de MARGEN en toda la
tabla DETALLE_ORDENES.

La subconsulta (SELECT MAX(MARGEN) FROM DETALLE_ORDENES) se encarga de


encontrar el valor máximo de MARGEN en la tabla DETALLE_ORDENES. Luego, la consulta
principal utiliza ese valor máximo para filtrar las filas que tienen ese valor en la columna

MARGEN.

SELECT *

FROM DETALLE_ORDENES

WHERE MARGEN = (SELECT MAX(MARGEN) FROM DETALLE_ORDENES);

7. En el campo proveedor_nacional se debe dejar la palabra ‘SI’ si contiene al final del


dominio ‘.CO’

// seleccionamos todos los campos de la tabla "PROVEEDORES" donde el campo "CORREO_"


contiene la cadena ".co" en cualquier posición de su valor. El operador "LIKE" se utiliza para buscar
patrones en una cadena y el símbolo "%" se utiliza como comodín para representar cualquier
número de caracteres. En este caso, se está buscando cualquier valor de "CORREO_" que contenga
".co" en cualquier posición.

SELECT *

FROM PROVEEDORES

WHERE CORREO_ LIKE '%.co';

Para el proceso principal se espera realizar el llamando a un solo procedimiento, este


puede tener dentro el llamado a otro procedimiento y funciones que ayuden a
solucionar el ejercicio, puede hacer uso de tablas temporales si lo considera
necesario. El taller se debe entregar en un archivo llamado ‘proyecto.zip’ que
contenga los scripts necesarios para su ejecución, internamente cada archivo al
inicio debe tener un número que lo identifica con el orden en el cual se debe realizar
la ejecución.

También podría gustarte