PROYECTO 01 -
SEGUNDO PARCIAL Base de Datos
Avanzado
SOF-S-VE-6-2
INTEGRANTES:
NOROÑA MIGUEZ XAVIER ALEJANDRO
CLAVIJO FARIÑO HAROLD ESTEBAN
MORA HERRERA ARIEL JOSHUA
SANCHEZ VERA NEXAR ALLAM
UNIVERSIDAD DE GUAYAQUIL – CARRERA SOFTWARE
BASES DE DATOS AVANZADO –
DOCENTE: LSI. MARIA ISABEL GALARZA, Mg.
FECHA DE ENTREGA: 29-01-2025
ENTREGAR UN DOCUMENTO PDF QUE INCLUYA PANTALLAS DE LOS PROCESOS REAL
IZADOS
1. Crear un SP (Stored Procedure) para obtener el porcentaje de Participación por
SUCURSAL considerando lo siguiente:
La consulta puede incluir varias sentencias Select.
• Crear un SP que reciba dos parámetros de FECHA_INICIAL y FECHA_FINAL
• Consultar solo las facturas con estado Registrada
• Anexar los totales a la consulta, los cuales pueden ser obtenidos con una consulta
adicional y para ver el detalle junto con los totales puede utilizar UNION.
• Probablemente requiera utilizar la sentencia UPDATE en caso de usar una tabla
CATEGORÍA
UNIDADES %PARTICIP UNIDADES
SUCURSAL1 180 33.7%
SUCURSAL2 194 36.3%
SUCURSAL3 160 30.0%
TOTALES 534 100.0%
temporal. También puede obtener los resultados sin crear tabla temporal. Ejemplo:
CREATE PROCEDURE PA_PORCENTAJE_PARTICIPACION_SUCURSAL(
@FECHA_INICIAL DATETIME,
@FECHA_FINAL DATETIME
)
AS
BEGIN
SET NOCOUNT ON;
-- Tabla temporal para almacenar los resultados
CREATE TABLE #ParticipacionSucursal (
SUCURSAL_NOMBRE NVARCHAR(255),
TOTAL_VENTAS FLOAT,
PORCENTAJE_PARTICIPACION FLOAT
);
-- Consulta detallada de ventas por sucursal
INSERT INTO #ParticipacionSucursal (SUCURSAL_NOMBRE, TOTAL_VENTAS,
PORCENTAJE_PARTICIPACION)
SELECT
S.SUCURSAL_NOMBRE,
SUM([Link] * [Link]) AS TOTAL_VENTAS,
0 AS PORCENTAJE_PARTICIPACION -- Se calculará posteriormente
FROM
VENTAS V
INNER JOIN
SUCURSAL S ON V.SUCURSAL_ID = S.SUCURSAL_ID
WHERE
[Link] = 1 -- Solo facturas con estado "Registrada"
AND V.FECHA_HORA BETWEEN @FECHA_INICIAL AND @FECHA_FINAL
GROUP BY
S.SUCURSAL_NOMBRE;
-- Total general de ventas
DECLARE @TotalVentasGeneral FLOAT;
SELECT @TotalVentasGeneral = SUM(TOTAL_VENTAS) FROM #ParticipacionSucursal;
-- Actualizar el porcentaje de participación
UPDATE #ParticipacionSucursal
SET PORCENTAJE_PARTICIPACION = (TOTAL_VENTAS / @TotalVentasGeneral) * 100;
-- Obtener resultados detallados y totales
SELECT
SUCURSAL_NOMBRE,
TOTAL_VENTAS,
PORCENTAJE_PARTICIPACION
FROM
#ParticipacionSucursal
UNION ALL
SELECT
'TOTAL' AS SUCURSAL_NOMBRE,
@TotalVentasGeneral AS TOTAL_VENTAS,
100 AS PORCENTAJE_PARTICIPACION;
-- Limpieza de la tabla temporal
DROP TABLE #ParticipacionSucursal;
END;
GO
EXEC PA_PORCENTAJE_PARTICIPACION_SUCURSAL '2017-01-01', '2019-12-31';
2. Crear una función para obtener el porcentaje de participación o distribución de
cada una de las sucursales considerando lo siguiente:
• El código de la sucursal debe ser enviado como parámetro.
• El Resultado debe mostrar la sucursal y el porcentaje de Participación. Ejemplo:
SUCURSAL | PARTICIPACIÓN
DELL 12.3%
CREATE FUNCTION FUN_PARTICIPACION_SUCURSAL (
@SUCURSAL_ID FLOAT
)
RETURNS TABLE
AS
RETURN
(
SELECT S.SUCURSAL_NOMBRE AS SUCURSAL,
CAST((SUM([Link] * [Link]) * 100.0) /
(SELECT SUM(PRECIO * UNIDADES)
FROM VENTAS
WHERE ESTADO = 1) AS DECIMAL(10, 2)) AS PARTICIPACION
FROM VENTAS V
INNER JOIN SUCURSAL S ON V.SUCURSAL_ID = S.SUCURSAL_ID
WHERE [Link] = 1 -- Solo facturas con estado "Registrada"
AND V.SUCURSAL_ID = @SUCURSAL_ID
GROUP BY S.SUCURSAL_NOMBRE
);
GO
SELECT * FROM FUN_PARTICIPACION_SUCURSAL(3);
3. Crear un Trigger considerando lo siguiente:
• Agregar una columna llamada SEMESTRE a la tabla de Ventas.
• Actualizar la columna SEMESTRE con los siguientes dos valores PRIMER SEMESTRE y
SEGUNDO SEMESTRE dependiendo de la fecha.
• Crear un trigger que actualice el campo SEMESTRE si se cambia una fecha en
cualquier registro de la tabla de Ventas. No es normal que se altere una fecha, pero
para la práctica lo haremos.
• Ejemplo: Si cambiamos la fecha del campo FECHA_HORA de
2020-01-01 a la fecha 2022-01-01, la columna SEMESTRE cambiará de PRIMER
SEMESTRE a SEGUNDO SEMESTRE.
CREATE TRIGGER TRG_ACTUALIZAR_SEMESTRE
ON VENTAS
AFTER INSERT, UPDATE
AS
BEGIN
IF UPDATE(FECHA_HORA)
BEGIN
UPDATE v
SET SEMESTRE = CASE
WHEN MONTH(v.FECHA_HORA) BETWEEN 1 AND 6 THEN 'PRIMER
SEMESTRE'
ELSE 'SEGUNDO SEMESTRE'
END
FROM VENTAS v
WHERE v.ID_FACTURA IN (SELECT ID_FACTURA FROM inserted);
END
END;
INSERT INTO VENTAS (ID_FACTURA, NUM_FACT, FECHA_HORA, CLIENTE_ID,
PRODUCTO_ID, MODELO_ID, CATEG_ID, MARCA_ID, SUCURSAL_ID, CAJA_ID,
VENDEDOR_ID, PRECIO, UNIDADES, ESTADO)
VALUES ('236589', '002-004-4233', '2018-03-15 [Link].000', 1, 1, 1, 1, 3, 2, 2, 3, 200,
2, 1);
SELECT * FROM VENTAS;
UPDATE VENTAS
SET FECHA_HORA = '2018-07-15 [Link].000'
WHERE NUM_FACT = '002-004-4233';
SELECT * FROM VENTAS;
4. Obtener la siguiente consulta mediante un SP.
Incluir parámetros de Fecha, sucursal y ciudad. Si se envía NULL en los parámetros de
SUCURSAL o CIUDAD, se muestran todas las sucursales o ciudades.
AÑO | MES | MARCA | UNID | VALOR_USD | TRANSACCIONES
2018 | 1- ENERO | DELL | 229 | 1200 | 130
CREATE PROCEDURE PA_FECHAS_SUCURSALES(
@FechaInicio DATE,
@FechaFin DATE,
@SucursalID FLOAT,
@CiudadID FLOAT
)AS
BEGIN
SELECT
YEAR(FECHA_HORA) AS ANO,
DATENAME(MONTH, FECHA_HORA) AS MES,
m.MARCA_NOMBRE AS MARCA,
SUM(CASE WHEN [Link] = 1 THEN UNIDADES ELSE 0 END) AS UNID,
SUM(CASE WHEN [Link] = 1 THEN [Link] * UNIDADES ELSE 0 END) AS
VALOR_USD,
COUNT(DISTINCT CASE WHEN [Link] = 1 THEN ID_FACTURA ELSE NULL END
) AS
TRANSACCIONES
FROM VENTAS v
INNER JOIN PRODUCTO p ON v.PRODUCTO_ID = p.PRODUCTO_ID
INNER JOIN MARCA m ON p.MARCA_ID = m.MARCA_ID
LEFT JOIN SUCURSAL s ON v.SUCURSAL_ID = s.SUCURSAL_ID
LEFT JOIN CIUDAD c ON s.CIUDAD_ID = c.CIUDAD_ID
WHERE (@FechaInicio IS NULL OR FECHA_HORA >= @FechaInicio)
AND (@FechaFin IS NULL OR FECHA_HORA <= @FechaFin)
AND (@SucursalID IS NULL OR v.SUCURSAL_ID = @SucursalID)
AND (@CiudadID IS NULL OR c.CIUDAD_ID = @CiudadID)
GROUP BY YEAR(FECHA_HORA), MONTH(FECHA_HORA), DATENAME(MONTH,
FECHA_HORA), m.MARCA_NOMBRE
ORDER BY YEAR(FECHA_HORA), MONTH(FECHA_HORA);
END;
EXEC PA_FECHAS_SUCURSALES @FechaInicio = '2017-01-01', @FechaFin = '2018-12-31',
@SucursalID = NULL, @CiudadID = NULL;
5. Presentar un comentario acerca de la utilidad de consultas PIVOTE
Desde mi perspectiva, las consultas PIVOTE en SQL resultan muy prácticas para convertir datos de
un formato vertical a uno horizontal, lo que aporta grandes ventajas en distintos contextos.
1. Análisis de tendencias: Facilita la identificación de patrones en los datos al distribuir la
información en columnas según categorías específicas.
2. Generación de informes personalizados: Permite transformar valores de una columna en
encabezados, mejorando la organización y comprensión de la información.
3. Comparación de periodos: Es útil para evaluar métricas a lo largo del tiempo, como meses,
trimestres o años, al presentar los datos en paralelo.
4. Optimización para análisis estadísticos: Estructura los datos de manera que sean más fáciles
de analizar o visualizar en estudios estadísticos.
5. Eficiencia mejorada: Disminuye la necesidad de realizar múltiples consultas o
procesamiento adicional en aplicaciones cliente.