BASE DE DATOS
PARA NEGOCIO “CIBER@NGIE”
Arianna Bolívar Rincon
Kennier Andres Licona Lozano
Roberto Junior Martinez Paternina
Samuel Enrique Moncrieff Chamorro
TRABAJO DE BASE DE DATOS PRESENTADO A LA DOCENTE:
MARIA CLAUDIA BONFANTE RODRIGUEZ
UNIVERSIDAD DE CARTAGENA
FACULTAD DE INGENIERÍA
PROGRAMA DE INGENIERÍA DE SISTEMAS
IV SEMESTRE
2024
CARTAGENA DE INDIAS D. T. Y C.
Reglas del Negocio
El negocio Ciber@ngie es una microempresa ubicada en el barrio Olaya Herrera, sector Las
Américas, en Cartagena de Indias. Se especializa en ofrecer productos de papelería, accesorios y
artículos diversos, así como servicios de ciber, impresión y papelería personalizada.
Entre su oferta de productos destacan lápices, borradores, sacapuntas, cartulinas, y accesorios de
belleza como tintes y carteras, lo que la convierte en un punto clave tanto para estudiantes como para
profesionales en la zona. Además, brinda servicios como fotocopias, impresiones a color y blanco y
negro, escaneo de documentos, laminado y acceso a internet por hora.
Ciber@ngie trabaja con una red de proveedores confiables que garantizan la calidad y disponibilidad
de los productos ofrecidos en la tienda. Estos proveedores no solo abastecen regularmente artículos de
papelería y accesorios de belleza, sino que también responden rápidamente a pedidos urgentes en
temporadas de alta demanda, como el inicio de clases o festividades locales. Por otro lado, el
inventario del negocio es administrado cuidadosamente, registrando cada entrada de mercancía con su
fecha de ingreso y manteniendo actualizadas las cantidades disponibles. Esto asegura que siempre
haya suficiente stock para cubrir las necesidades de los clientes, minimizando pérdidas por productos
agotados o vencidos.
Entidades
1. Proveedores: Cada proveedor debe tener un nombre único y al menos un dato de contacto (teléfono
o email).
2. Productos: Cada producto debe tener un precio mayor o igual a 0 y estar asociado a un proveedor
registrado.
3. Clientes: Los clientes deben registrarse con un ID único y un nombre.
4. Facturación:
- Los productos y servicios deben facturarse con cantidades mayores a 0.
- Los valores unitarios y totales no deben ser negativos.
5. Servicios: Cada servicio debe tener un valor mayor o igual a 0.
6. Empleados: Cada empleado debe estar asociado a una empresa registrada y contar con un cargo
definido.
7. Inventario:
- Los productos registrados deben tener cantidades disponibles mayores o iguales a 0.
- El inventario debe registrar la fecha de ingreso.
8. Empresa: Representa los datos principales del negocio, permitiendo su identificación formal ante
proveedores, clientes y entidades legales.
9. HistorialServicios: Registra el uso de servicios por parte de los clientes, permitiendo un
seguimiento detallado de las actividades realizadas.
10. FacturaciónServicios: Registra la información detallada de los servicios contratados por los
clientes.
Modelo Entidad - Relación
Modelo Relacional
Relaciones
1. Proveedores y Productos:
Existe una relación de uno a muchos entre Proveedores y Productos, ya que cada proveedor
puede suministrar múltiples productos. Esta relación está representada por la clave foránea
IdProveedor en la tabla Productos, que apunta a la tabla Proveedores.
2. Productos e Inventario:
Hay una relación de uno a uno entre Productos e Inventario, dado que cada producto
registrado debe tener una cantidad disponible asociada en el inventario. La clave foránea
IdProducto en la tabla Inventario enlaza a la tabla Productos, permitiendo controlar las
existencias.
3. Clientes y Facturación:
La relación entre Clientes y Facturación es de uno a muchos, ya que un cliente puede
realizar múltiples compras (facturas). Esto se representa mediante la clave foránea IdCliente
en la tabla Facturación, que apunta a la tabla Clientes.
4. Facturación y Productos:
Existe una relación de muchos a muchos entre Facturación y Productos, ya que una factura
puede incluir varios productos, y un producto puede estar presente en diferentes facturas. Esta
relación se maneja directamente en la tabla Facturación con los campos IdProductos y
Cantidad.
5. Servicios y FacturaciónServicios:
La relación entre Servicios y FacturaciónServicios es de uno a muchos, ya que un servicio
puede estar incluido en múltiples facturas de servicios. Esto se representa mediante la clave
foránea IdServicios en la tabla FacturaciónServicios.
6. Clientes y FacturaciónServicios:
La relación entre Clientes y FacturaciónServicios es de uno a muchos, ya que un cliente
puede contratar múltiples servicios que se registran en facturas. La clave foránea IdCliente en
la tabla FacturaciónServicios apunta a la tabla Clientes.
7. Servicios e HistorialServicios:
Existe una relación de uno a muchos entre Servicios e HistorialServicios, ya que un servicio
puede ser contratado varias veces por diferentes clientes. Esto se refleja mediante la clave
foránea IdServicios en la tabla HistorialServicios.
8. Clientes e HistorialServicios:
Hay una relación de uno a muchos entre Clientes e HistorialServicios, ya que un cliente
puede tener múltiples registros de servicios contratados. Esto se representa con la clave
foránea IdClientes en la tabla HistorialServicios.
9. Empresa y Empleados:
La relación entre Empresa y Empleados es de uno a muchos, ya que una empresa puede
contar con varios empleados. La clave foránea Nit en la tabla Empleados apunta a la tabla
Empresa, estableciendo el vínculo.
Script MySql
USE Negocio;
CREATE TABLE Proveedores (
IdProveedor INT PRIMARY KEY AUTO_INCREMENT,
NombreProveedor VARCHAR(30) NOT NULL,
TelefonoProveedor VARCHAR(20) not null,
EmailProveedor VARCHAR(50)
);
CREATE TABLE Productos (
IdProducto INT PRIMARY KEY AUTO_INCREMENT,
NombreProducto VARCHAR(30) NOT NULL,
PrecioProducto DECIMAL(10, 2) CHECK (PrecioProducto >= 0),
IdProveedor INT not null,
FOREIGN KEY (IdProveedor) REFERENCES Proveedores(IdProveedor)
);
CREATE TABLE Clientes (
IdCliente INT PRIMARY KEY AUTO_INCREMENT,
Nombre VARCHAR(30) NOT NULL
);
CREATE TABLE Facturacion (
IdFactura INT PRIMARY KEY AUTO_INCREMENT,
IdCliente INT not null,
IdProducto INT not null,
Cantidad INT CHECK (Cantidad > 0) not null,
ValorUnitario DECIMAL(10, 2) CHECK (ValorUnitario >= 0) not null,
ValorTotal DECIMAL(10, 2) CHECK (ValorTotal >= 0) not null,
Fecha DATE not null,
FOREIGN KEY (IdCliente) REFERENCES Clientes(IdCliente),
FOREIGN KEY (IdProducto) REFERENCES Productos(IdProducto)
);
CREATE TABLE Servicios (
IdServicio INT PRIMARY KEY AUTO_INCREMENT,
TipoServicio VARCHAR(20) not null,
NombreServicio VARCHAR(30) not null,
ValorServicio DECIMAL(10, 2) CHECK (ValorServicio >= 0) not null
);
CREATE TABLE Empresa (
Nit VARCHAR(20) PRIMARY KEY ,
Nombre VARCHAR(30) NOT NULL,
Correo VARCHAR(50)
);
CREATE TABLE Empleados (
IdEmpleado INT PRIMARY KEY AUTO_INCREMENT,
Nombre VARCHAR(30) NOT NULL,
Telefono VARCHAR(20),
Cargo VARCHAR(20) not null,
FechaIngreso DATE not null,
Nit VARCHAR(20) not null,
FOREIGN KEY (Nit) REFERENCES Empresa(Nit)
);
CREATE TABLE FacturacionServicios (
IdFacturaServicio INT PRIMARY KEY AUTO_INCREMENT,
IdCliente INT not null,
IdServicio INT not null,
Cantidad INT CHECK (Cantidad >= 0) not null,
ValorUnitario DECIMAL(10, 2) CHECK (ValorUnitario >= 0) not null,
ValorTotal DECIMAL(10, 2) CHECK (ValorTotal >= 0),
Fecha DATE,
FOREIGN KEY (IdCliente) REFERENCES Clientes(IdCliente),
FOREIGN KEY (IdServicio) REFERENCES Servicios(IdServicio)
);
CREATE TABLE Inventario (
IdInventario INT PRIMARY KEY AUTO_INCREMENT,
IdProducto INT,
CantidadDisponible INT CHECK (CantidadDisponible >= 0),
FechaIngreso DATE not null,
FOREIGN KEY (IdProducto) REFERENCES Productos(IdProducto)
);
CREATE TABLE HistorialServicios (
IdHistorial INT PRIMARY KEY AUTO_INCREMENT,
IdCliente INT not null,
IdServicio INT not null,
FechaInicio DATE not null,
FechaFin DATE not null,
FOREIGN KEY (IdCliente) REFERENCES Clientes(IdCliente),
FOREIGN KEY (IdServicio) REFERENCES Servicios(IdServicio)
);
-- Proveedores
INSERT INTO Proveedores (NombreProveedor, TelefonoProveedor, EmailProveedor) VALUES
('Veneplast ', '6056746523', null),
('Fantasias y varidades LYM', '3112345678', '[email protected]');
-- Productos
INSERT INTO Productos (NombreProducto, PrecioProducto, IdProveedor) VALUES
('Lapiz HB', 500, 1),
('Borrador', 300, 1),
('Sacapuntas', 700, 1),
('Block de hojas', 3500, 1),
('Cartulina', 1200, 1),
('Cinta adhesiva', 2500, 1),
('Silicona', 1500, 1),
('Colbon', 2000, 1),
('Foami', 1000, 1),
('Shampoo', 5000, 2),
('Tratamiento para el cabello', 8500, 2),
('Gancho para cabello', 800, 2),
('Tinte de cabello', 12000, 2),
('Cartera', 25000, 2),
('Monedero', 15000, 2),
('Globo', 500, 2),
('Vela de cumpleaños', 1000, 2),
('Aretes', 5000, 2),
('Pinta uñas', 3000, 2);
-- Clientes
-- Clientes
INSERT INTO Clientes (IdCliente, Nombre) VALUES
(1234567, 'Cristian Nodal'),
(2345678, 'Altair Auditore'),
(3456789, 'Connor Kenway'),
(4567890, 'Austin Power'),
(5678901, 'Arno Dorian'),
(6789012, 'Alex Mercer'),
(7890123, 'Eren Jeager'),
(8901234, 'Juan Luis Londoño'),
(9012345, 'José Alvaro Osorio'),
(9123456, 'David Bisbal'),
(10012345, 'Hary Styles'),
(10023456, 'Dylan Obrian');
-- Servicios (con valores específicos de papelería y ciber)
INSERT INTO Servicios (TipoServicio, NombreServicio, ValorServicio) VALUES
('Internet', 'Hora de Internet', 1000),
('Fotocopia', 'Fotocopia Blanco y Negro', 200),
('Fotocopia', 'Fotocopia a Color', 500),
('Impresion', 'Impresion Blanco y Negro', 300),
('Impresion', 'Impresion a Color', 700),
('Escaneo', 'Escaneo de Documentos', 400),
('Laminado', 'Laminado de Documento Letter', 2500);
-- Empresa
INSERT INTO Empresa (Nit, Nombre, Correo) VALUES
('900123456', 'Ciber@ngie', '[email protected]');
-- Empleados
INSERT INTO Empleados (Nombre, Telefono, Cargo, FechaIngreso, Nit) VALUES
('Kennier Licona', '3134567890', 'Cajero', '2012-01-15', '900123456'),
('Roberto Martinez', '3145678901', 'Administrador', '2022-05-10', '900123456'),
('Arianna bolivar', '3156789012', 'Atención al cliente', '2023-03-12', '900123456'),
('Samuel Moncrieft', '3024445034', 'Atención al cliente', '2023-06-11', '900123456');
-- Facturacion (compras de productos)
INSERT INTO Facturacion (IdCliente, IdProducto, Cantidad, ValorUnitario, ValorTotal, Fecha)
VALUES
(1234567, 2, 1, 300, 300, '2024-11-15'),
(2345678, 4, 2, 3500, 7000, '2024-11-16'),
(3456789, 7, 1, 1500, 1500, '2024-11-17'),
(4567890, 9, 3, 1000, 3000, '2024-11-18'),
(5678901, 10, 1, 5000, 5000, '2024-11-19'),
(6789012, 12, 2, 800, 1600, '2024-11-20'),
(7890123, 14, 1, 25000, 25000, '2024-11-21'),
(8901234, 15, 5, 15000, 75000, '2024-11-22');
-- FacturacionServicios (compra de servicios)
INSERT INTO FacturacionServicios (IdCliente, IdServicio, Cantidad, ValorUnitario, ValorTotal,
Fecha) VALUES
(1234567, 3, 4, 500, 2000, '2024-11-15'),
(2345678, 6, 2, 400, 800, '2024-11-16'),
(3456789, 4, 3, 300, 900, '2024-11-17'),
(4567890, 5, 2, 700, 1400, '2024-11-18'),
(5678901, 7, 1, 1500, 1500, '2024-11-19'),
(6789012, 2, 1, 200, 200, '2024-11-20'),
(7890123, 1, 1, 1000, 1000, '2024-11-21'),
(8901234, 1, 2, 1000, 2000, '2024-11-22');
-- Inventario (productos adicionales en inventario)
INSERT INTO Inventario (IdProducto, CantidadDisponible, FechaIngreso) VALUES
(3, 150, '2024-01-17'), -- 150 sacapuntas
(4, 75, '2024-02-10'), -- 75 blocks de hojas
(5, 300, '2024-02-15'), -- 300 cartulinas
(6, 50, '2024-03-01'), -- 50 cintas adhesivas
(7, 120, '2024-03-05'), -- 120 siliconas
(15, 20, '2024-03-10'), -- 20 carteras
(16, 80, '2024-03-15'), -- 80 monederos
(18, 100, '2024-03-20'); -- 100 globos
-- HistorialServicios (historial adicional de servicios prestados)
INSERT INTO HistorialServicios (IdCliente, IdServicio, FechaInicio, FechaFin) VALUES
(1234567, 1, '2024-11-15', '2024-11-15'),
(2345678, 3, '2024-11-16', '2024-11-16'),
(3456789, 4, '2024-11-17', '2024-11-17'),
(4567890, 5, '2024-11-18', '2024-11-18'),
(5678901, 7, '2024-11-19', '2024-11-19'),
(6789012, 2, '2024-11-20', '2024-11-20'),
(7890123, 1, '2024-11-21', '2024-11-21'),
(8901234, 1, '2024-11-22', '2024-11-22');
CREATE TABLE Proveedores (
IdProveedor INT PRIMARY KEY AUTO_INCREMENT,
NombreProveedor VARCHAR(30) NOT NULL,
TelefonoProveedor VARCHAR(20) not null,
EmailProveedor VARCHAR(50)
);
CREATE TABLE Productos (
IdProducto INT PRIMARY KEY AUTO_INCREMENT,
NombreProducto VARCHAR(30) NOT NULL,
PrecioProducto DECIMAL(10, 2) CHECK (PrecioProducto >= 0),
IdProveedor INT not null,
FOREIGN KEY (IdProveedor) REFERENCES Proveedores(IdProveedor)
);
CREATE TABLE Clientes (
IdCliente INT PRIMARY KEY AUTO_INCREMENT,
Nombre VARCHAR(30) NOT NULL
);
CREATE TABLE Facturacion (
IdFactura INT PRIMARY KEY AUTO_INCREMENT,
IdCliente INT not null,
IdProducto INT not null,
Cantidad INT CHECK (Cantidad > 0) not null,
ValorUnitario DECIMAL(10, 2) CHECK (ValorUnitario >= 0) not null,
ValorTotal DECIMAL(10, 2) CHECK (ValorTotal >= 0) not null,
Fecha DATE not null,
FOREIGN KEY (IdCliente) REFERENCES Clientes(IdCliente),
FOREIGN KEY (IdProducto) REFERENCES Productos(IdProducto)
);
CREATE TABLE Servicios (
IdServicio INT PRIMARY KEY AUTO_INCREMENT,
TipoServicio VARCHAR(20) not null,
NombreServicio VARCHAR(30) not null,
ValorServicio DECIMAL(10, 2) CHECK (ValorServicio >= 0) not null
);
CREATE TABLE Empresa (
Nit VARCHAR(20) PRIMARY KEY ,
Nombre VARCHAR(30) NOT NULL,
Correo VARCHAR(50)
);
CREATE TABLE Empleados (
IdEmpleado INT PRIMARY KEY AUTO_INCREMENT,
Nombre VARCHAR(30) NOT NULL,
Telefono VARCHAR(20),
Cargo VARCHAR(20) not null,
FechaIngreso DATE not null,
Nit VARCHAR(20) not null,
FOREIGN KEY (Nit) REFERENCES Empresa(Nit)
);
CREATE TABLE FacturacionServicios (
IdFacturaServicio INT PRIMARY KEY AUTO_INCREMENT,
IdCliente INT not null,
IdServicio INT not null,
Cantidad INT CHECK (Cantidad >= 0) not null,
ValorUnitario DECIMAL(10, 2) CHECK (ValorUnitario >= 0) not null,
ValorTotal DECIMAL(10, 2) CHECK (ValorTotal >= 0),
Fecha DATE,
FOREIGN KEY (IdCliente) REFERENCES Clientes(IdCliente),
FOREIGN KEY (IdServicio) REFERENCES Servicios(IdServicio)
);
CREATE TABLE Inventario (
IdInventario INT PRIMARY KEY AUTO_INCREMENT,
IdProducto INT,
CantidadDisponible INT CHECK (CantidadDisponible >= 0),
FechaIngreso DATE not null,
FOREIGN KEY (IdProducto) REFERENCES Productos(IdProducto)
);
CREATE TABLE HistorialServicios (
IdHistorial INT PRIMARY KEY AUTO_INCREMENT,
IdCliente INT not null,
IdServicio INT not null,
FechaInicio DATE not null,
FechaFin DATE not null,
FOREIGN KEY (IdCliente) REFERENCES Clientes(IdCliente),
FOREIGN KEY (IdServicio) REFERENCES Servicios(IdServicio)
);
-- Proveedores
INSERT INTO Proveedores (NombreProveedor, TelefonoProveedor, EmailProveedor) VALUES
('Veneplast ', '6056746523', null),
('Fantasias y varidades LYM', '3112345678', '[email protected]');
-- Productos
INSERT INTO Productos (NombreProducto, PrecioProducto, IdProveedor) VALUES
('Lapiz HB', 500, 1),
('Borrador', 300, 1),
('Sacapuntas', 700, 1),
('Block de hojas', 3500, 1),
('Cartulina', 1200, 1),
('Cinta adhesiva', 2500, 1),
('Silicona', 1500, 1),
('Colbon', 2000, 1),
('Foami', 1000, 1),
('Shampoo', 5000, 2),
('Tratamiento para el cabello', 8500, 2),
('Gancho para cabello', 800, 2),
('Tinte de cabello', 12000, 2),
('Cartera', 25000, 2),
('Monedero', 15000, 2),
('Globo', 500, 2),
('Vela de cumpleaños', 1000, 2),
('Aretes', 5000, 2),
('Pinta uñas', 3000, 2);
-- Clientes
-- Clientes
INSERT INTO Clientes (IdCliente, Nombre) VALUES
(1234567, 'Cristian Nodal'),
(2345678, 'Altair Auditore'),
(3456789, 'Connor Kenway'),
(4567890, 'Austin Power'),
(5678901, 'Arno Dorian'),
(6789012, 'Alex Mercer'),
(7890123, 'Eren Jeager'),
(8901234, 'Juan Luis Londoño'),
(9012345, 'José Alvaro Osorio'),
(9123456, 'David Bisbal'),
(10012345, 'Hary Styles'),
(10023456, 'Dylan Obrian');
-- Servicios (con valores específicos de papelería y ciber)
INSERT INTO Servicios (TipoServicio, NombreServicio, ValorServicio) VALUES
('Internet', 'Hora de Internet', 1000),
('Fotocopia', 'Fotocopia Blanco y Negro', 200),
('Fotocopia', 'Fotocopia a Color', 500),
('Impresion', 'Impresion Blanco y Negro', 300),
('Impresion', 'Impresion a Color', 700),
('Escaneo', 'Escaneo de Documentos', 400),
('Laminado', 'Laminado de Documento Letter', 2500);
-- Empresa
INSERT INTO Empresa (Nit, Nombre, Correo) VALUES
('900123456', 'Ciber@ngie', [email protected]');
-- Empleados
INSERT INTO Empleados (Nombre, Telefono, Cargo, FechaIngreso, Nit) VALUES
('Kennier Licona', '3134567890', 'Cajero', '2012-01-15', '900123456'),
('Roberto Martinez', '3145678901', 'Administrador', '2022-05-10', '900123456'),
('Arianna bolivar', '3156789012', 'Atención al cliente', '2023-03-12', '900123456');
-- Facturacion (compras de productos)
INSERT INTO Facturacion (IdCliente, IdProducto, Cantidad, ValorUnitario, ValorTotal, Fecha)
VALUES
(1234567, 2, 1, 300, 300, '2024-11-15'),
(2345678, 4, 2, 3500, 7000, '2024-11-16'),
(3456789, 7, 1, 1500, 1500, '2024-11-17'),
(4567890, 9, 3, 1000, 3000, '2024-11-18'),
(5678901, 10, 1, 5000, 5000, '2024-11-19'),
(6789012, 12, 2, 800, 1600, '2024-11-20'),
(7890123, 14, 1, 25000, 25000, '2024-11-21'),
(8901234, 15, 5, 15000, 75000, '2024-11-22');
-- FacturacionServicios (compra de servicios)
INSERT INTO FacturacionServicios (IdCliente, IdServicio, Cantidad, ValorUnitario, ValorTotal,
Fecha) VALUES
(1234567, 3, 4, 500, 2000, '2024-11-15'),
(2345678, 6, 2, 400, 800, '2024-11-16'),
(3456789, 4, 3, 300, 900, '2024-11-17'),
(4567890, 5, 2, 700, 1400, '2024-11-18'),
(5678901, 7, 1, 1500, 1500, '2024-11-19'),
(6789012, 2, 1, 200, 200, '2024-11-20'),
(7890123, 1, 1, 1000, 1000, '2024-11-21'),
(8901234, 1, 2, 1000, 2000, '2024-11-22');
-- Inventario (productos adicionales en inventario)
INSERT INTO Inventario (IdProducto, CantidadDisponible, FechaIngreso) VALUES
(3, 150, '2024-01-17'), -- 150 sacapuntas
(4, 75, '2024-02-10'), -- 75 blocks de hojas
(5, 300, '2024-02-15'), -- 300 cartulinas
(6, 50, '2024-03-01'), -- 50 cintas adhesivas
(7, 120, '2024-03-05'), -- 120 siliconas
(15, 20, '2024-03-10'), -- 20 carteras
(16, 80, '2024-03-15'), -- 80 monederos
(18, 100, '2024-03-20'); -- 100 globos
-- HistorialServicios (historial adicional de servicios prestados)
INSERT INTO HistorialServicios (IdCliente, IdServicio, FechaInicio, FechaFin) VALUES
(1234567, 1, '2024-11-15', '2024-11-15'),
(2345678, 3, '2024-11-16', '2024-11-16'),
(3456789, 4, '2024-11-17', '2024-11-17'),
(4567890, 5, '2024-11-18', '2024-11-18'),
(5678901, 7, '2024-11-19', '2024-11-19'),
(6789012, 2, '2024-11-20', '2024-11-20'),
(7890123, 1, '2024-11-21', '2024-11-21'),
(8901234, 1, '2024-11-22', '2024-11-22');
-- Consultas simples
-- Listado de todos los proveedores y sus datos de contacto
SELECT NombreProveedor, TelefonoProveedor, EmailProveedor
FROM Proveedores;
-- Consultar los productos con un precio mayor a 5000
SELECT NombreProducto, PrecioProducto
FROM Productos
WHERE PrecioProducto > 5000;
-- Servicios cuyo valor es menor o igual a 1000
SELECT NombreServicio, ValorServicio
FROM Servicios
WHERE ValorServicio <= 1000;
-- Consultas por grupo
-- Cantidad de productos ofrecidos por cada proveedor
SELECT p.NombreProveedor, COUNT(pr.IdProducto) AS TotalProductos
FROM Proveedores p
JOIN Productos pr ON p.IdProveedor = pr.IdProveedor
GROUP BY p.NombreProveedor;
-- Valor total facturado por cliente (productos)
SELECT c.Nombre AS NombreCliente, SUM(f.ValorTotal) AS TotalFacturado
FROM Facturacion f
JOIN Clientes c ON f.IdCliente = c.IdCliente
GROUP BY c.Nombre;
-- Cantidad de servicios vendidos agrupados por tipo
SELECT s.TipoServicio, SUM(fs.Cantidad) AS TotalServiciosVendidos
FROM FacturacionServicios fs
JOIN Servicios s ON fs.IdServicio = s.IdServicio
GROUP BY s.TipoServicio;
-- Consultas por join
-- Facturación de productos con detalle del cliente y producto
SELECT c.Nombre AS Cliente, p.NombreProducto AS Producto, f.Cantidad, f.ValorTotal, f.Fecha
FROM Facturacion f
JOIN Clientes c ON f.IdCliente = c.IdCliente
JOIN Productos p ON f.IdProducto = p.IdProducto;
-- Inventario con el nombre del producto y cantidad disponible
SELECT p.NombreProducto, i.CantidadDisponible, i.FechaIngreso
FROM Inventario i
JOIN Productos p ON i.IdProducto = p.IdProducto;
-- Historial de servicios prestados con información del cliente y servicio
SELECT c.Nombre AS Cliente, s.NombreServicio AS Servicio, h.FechaInicio, h.FechaFin
FROM HistorialServicios h
JOIN Clientes c ON h.IdCliente = c.IdCliente
JOIN Servicios s ON h.IdServicio = s.IdServicio;
-- Productos y sus proveedores con precios y datos de contacto
SELECT pr.NombreProducto, pr.PrecioProducto, p.NombreProveedor, p.TelefonoProveedor,
p.EmailProveedor
FROM Productos pr
JOIN Proveedores p ON pr.IdProveedor = p.IdProveedor;
CREATE TABLE CambiosPrecios (
IdCambio INT PRIMARY KEY AUTO_INCREMENT,
IdProducto INT NOT NULL,
NombreProducto VARCHAR(30) NOT NULL,
PrecioAnterior DECIMAL(10, 2) NOT NULL,
PrecioNuevo DECIMAL(10, 2) NOT NULL,
FechaCambio DATETIME NOT NULL
);
CREATE TABLE CambiosPreciosServicios (
IdCambio INT PRIMARY KEY AUTO_INCREMENT,
IdServicio INT NOT NULL,
NombreServicio VARCHAR(30) NOT NULL,
ValorAnterior DECIMAL(10, 2) NOT NULL,
ValorNuevo DECIMAL(10, 2) NOT NULL,
FechaCambio DATETIME NOT NULL
);
-- PROCEDIMIENTOS
DELIMITER $$
CREATE PROCEDURE verProductos()
BEGIN
SELECT * FROM productos;
END$$
DELIMITER ;
CALL verProductos();
DELIMITER $$
CREATE PROCEDURE registrarFacturaProductos (
IN p_IdCliente INT,
IN p_IdProducto INT,
IN p_Cantidad INT,
IN p_ValorUnitario DECIMAL (10, 2),
IN p_Fecha DATE
)
BEGIN
DECLARE p_ValorTotal DECIMAL (10, 2);
-- Calcular el valor total
SET p_ValorTotal = p_Cantidad * p_ValorUnitario;
-- Insertar en la tabla facturacion
INSERT INTO Facturacion (IdCliente, IdProducto, Cantidad, ValorUnitario, ValorTotal, Fecha)
VALUES (p_IdCliente, p_IdProducto, p_Cantidad, p_ValorUnitario, p_ValorTotal, p_Fecha);
END$$
DELIMITER ;
CALL RegistrarFacturaProductos(1234567, 2, 3, 300, '2024-12-01');
DELIMITER $$
CREATE PROCEDURE actualizarInventario (
IN p_IdProducto INT,
IN P_CantidadVendida INT
)
BEGIN
-- Actualizar la cantidad disponible en el inventario
UPDATE Inventario
SET CantidadDisponible = CantidadDisponible - p_CantidadVendida
WHERE IdProducto = p_IdProducto;
END$$
DELIMITER ;
-- Funciones
DELIMITER $$
CREATE FUNCTION TotalFacturadoCliente (p_IdCliente INT)
RETURNS DECIMAL (10, 2)
DETERMINISTIC
BEGIN
DECLARE total DECIMAL (10, 2);
-- Calcular el total faccturado por un cliente
SELECT SUM(ValorTotal)
INTO total
FROM Facturacion
WHERE IdCliente = p_IdCliente;
RETURN INFULL(total, 0);
END$$
DELIMITER ;
DELIMITER $$
CREATE FUNCTION CantidadDisponibleProducto(p_IdProducto INT)
RETURNS INT
DETERMINISTIC
BEGIN
DECLARE cantidad INT;
-- Obtener la cantidad disponible del producto
SELECT CantidadDisponible
INTO cantidad
FROM Inventario
WHERE IdProducto = p_IdProducto;
RETURN IFNULL(cantidad, 0);
END$$
DELIMITER ;
DELIMITER $$
CREATE TRIGGER ActualizarInventarioDespuesDeVenta
AFTER INSERT ON Facturacion
FOR EACH ROW
BEGIN
UPDATE Inventario
SET CantidadDisponible = CantidadDisponible - NEW.Cantidad
WHERE IdProducto = NEW.IdProducto;
END$$
DELIMITER $$
CREATE TRIGGER CalcularValorTotalProductos
BEFORE INSERT ON Facturacion
FOR EACH ROW
BEGIN
SET NEW.ValorTotal = NEW.Cantidad * NEW.ValorUnitario;
END$$
DELIMITER ;
DELIMITER $$
CREATE TRIGGER LogCambiosPrecioProducto
AFTER UPDATE ON Productos
FOR EACH ROW
BEGIN
IF NEW.PrecioProducto <> OLD.PrecioProducto THEN
INSERT INTO CambiosPrecios (IdProducto, NombreProducto, PrecioAnterior, PrecioNuevo,
FechaCambio)
VALUES (NEW.IdProducto, NEW.NombreProducto, OLD.PrecioProducto,
NEW.PrecioProducto, NOW());
END IF;
END$$
CREATE TRIGGER LogCambiosValorServicio
AFTER UPDATE ON Servicios
FOR EACH ROW
BEGIN
IF NEW.ValorServicio <> OLD.ValorServicio THEN
INSERT INTO CambiosPreciosServicios (IdServicio, NombreServicio, ValorAnterior,
ValorNuevo, FechaCambio)
VALUES (NEW.IdServicio, NEW.NombreServicio, OLD.ValorServicio, NEW.ValorServicio,
NOW());
END IF;
END$$
DELIMITER ;
ALTER TABLE Empleados ADD COLUMN Salario DECIMAL(10, 2) CHECK (Salario >= 0);
DELIMITER $$
CREATE TRIGGER RestriccionCambioSalario
BEFORE UPDATE ON Empleados
FOR EACH ROW
BEGIN
DECLARE incremento_maximo DECIMAL(10, 2);
SET incremento_maximo = OLD.Salario * 1.2;
IF NEW.Salario > incremento_maximo THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'El nuevo salario no puede exceder un 20% más que el anterior.';
END IF;
END$$
DELIMITER ;
0
Puede agregar este documento a su colección de estudio (s)
Iniciar sesión Disponible sólo para usuarios autorizadosPuede agregar este documento a su lista guardada
Iniciar sesión Disponible sólo para usuarios autorizados(Para quejas, use otra forma )