-- MySQL Workbench Forward Engineering
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
-- -----------------------------------------------------
-- Schema mercadillo
-- -----------------------------------------------------
-- -----------------------------------------------------
-- Schema mercadillo
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `mercadillo` DEFAULT CHARACTER SET utf8 ;
USE `mercadillo` ;
-- -----------------------------------------------------
-- Table `mercadillo`.`vendedores`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mercadillo`.`vendedores` (
`id` INT NOT NULL AUTO_INCREMENT,
`nombre` VARCHAR(45) NULL,
PRIMARY KEY (`id`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mercadillo`.`secciones`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mercadillo`.`secciones` (
`id` INT NOT NULL AUTO_INCREMENT,
`nombre` VARCHAR(45) NULL,
PRIMARY KEY (`id`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mercadillo`.`productos`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mercadillo`.`productos` (
`id` INT NOT NULL AUTO_INCREMENT,
`nombre` VARCHAR(45) NULL,
`fk_seccion` INT NOT NULL,
PRIMARY KEY (`id`),
INDEX `fk_productos_secciones_idx` (`fk_seccion` ASC) VISIBLE,
CONSTRAINT `fk_productos_secciones`
FOREIGN KEY (`fk_seccion`)
REFERENCES `mercadillo`.`secciones` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mercadillo`.`ventas`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mercadillo`.`ventas` (
`id` INT NOT NULL AUTO_INCREMENT,
`fk_vendedor` INT NOT NULL,
`fk_producto` INT NOT NULL,
`total` DECIMAL(6,2) NULL,
`fecha` DATE NULL,
INDEX `fk_vendedores_has_productos_productos1_idx` (`fk_producto` ASC) VISIBLE,
INDEX `fk_vendedores_has_productos_vendedores1_idx` (`fk_vendedor` ASC) VISIBLE,
PRIMARY KEY (`id`),
CONSTRAINT `fk_vendedores_has_productos_vendedores1`
FOREIGN KEY (`fk_vendedor`)
REFERENCES `mercadillo`.`vendedores` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_vendedores_has_productos_productos1`
FOREIGN KEY (`fk_producto`)
REFERENCES `mercadillo`.`productos` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
INSERT INTO vendedores (nombre)
VALUES ("Juan"), ("Perico"),("Andrés");
INSERT INTO secciones (nombre)
VALUES ("Alimentación"), ("Moda"),("Deportes");
INSERT INTO
productos (nombre,fk_seccion)
VALUES
("Manzanas",1),("Peras",1),("Sandías",1),
("Calcetines",2),("Calzoncillos",2),("Bragas",2),
("Balones",3),("Raquetas",3),("Remos",3);
create table semilla(id int);
insert into semilla values
(1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
CREATE TABLE numeros (id INT);
SET @i:=0;
INSERT INTO numeros SELECT @i:=@i+1
FROM semilla s1 cross JOIN semilla s2;
-- INSERT ignore INTO ventas
SELECT
null,
TRUNCATE(RAND()*3+1,0),
TRUNCATE(RAND()*9+1,0),
TRUNCATE(RAND()*100+1,2),
DATE_ADD("2024/1/1",INTERVAL TRUNCATE(RAND()*730,0) DAY) FROM numeros n1 CROSS JOIN numeros n2;
SET @facturacion:=170000;
SELECT
secciones.nombre, vendedores.nombre, sum(total) AS tot
FROM ventas right JOIN vendedores
ON ventas.fk_vendedor = vendedores.id
left JOIN productos ON ventas.fk_producto = productos.id
left JOIN secciones ON productos.fk_seccion = secciones.id
GROUP BY secciones.nombre, vendedores.nombre with ROLLUP;
-- HAVING tot>=@facturacion;
Agrupar las ventas tanto en importe como en transacciones, de los vendedores agrupando por vendedor, ejercicio (año), trimestre y secciones.
SELECT
vendedores.nombre, concat(sum(total),".-€") AS tot,
COUNT(ventas.id), YEAR(ventas.fecha),
QUARTER(fecha), secciones.nombre
FROM ventas right JOIN vendedores
ON ventas.fk_vendedor = vendedores.id
left JOIN productos ON ventas.fk_producto = productos.id
left JOIN secciones ON productos.fk_seccion = secciones.id
GROUP BY vendedores.nombre,
YEAR(ventas.fecha), QUARTER(fecha),
secciones.nombre with ROLLUP
Muestra el vendedor que menos vendió (en euros) en el segundo trimestre del 2025 sin contar los productos de la seccion «Moda»
SELECT v.nombre, SUM(ven.total) tot
FROM vendedores v left join ventas ven
ON v.id = ven.fk_vendedor LEFT JOIN productos p
ON p.id = ven.fk_producto LEFT JOIN secciones s
ON s.id = p.fk_seccion
WHERE QUARTER(ven.fecha)=2 AND year(ven.fecha)=2025 AND s.nombre not IN ("MODA")
GROUP BY v.nombre
ORDER BY tot ASC LIMIT 1;
Muestra la sección que más vendió (en euros) en el segundo y cuarto trimestre del 2024 sin contar las ventas de Perico.
SELECT s.nombre, SUM(ven.total) tot
FROM secciones s LEFT JOIN productos p
ON s.id = p.fk_seccion LEFT JOIN ventas ven
ON p.id = ven.fk_producto LEFT JOIN vendedores v
ON ven.fk_vendedor = v.id
WHERE QUARTER(ven.fecha) IN (2,4) AND
YEAR(ven.fecha) IN (2024)
-- AND v.nombre != "perico"
-- AND v.nombre NOT IN ("perico")
AND v.nombre <> "perico"
GROUP BY s.id
ORDER BY tot DESC LIMIT 1;
/* cuales son los producto que más se vendieron en el año 2025
por cada seccion */
CREATE VIEW ejercicio as
SELECT s.nombre sec, p.nombre pro, count(ven.id) tot
FROM secciones s LEFT JOIN productos p
ON s.id = p.fk_seccion LEFT JOIN ventas ven
ON p.id = ven.fk_producto
WHERE YEAR(ven.fecha) = 2025
GROUP BY sec, pro;
SELECT e1.pro, t.tm, t.sec FROM ejercicio e1 join
(SELECT MAX(e2.tot) AS tm, e2.sec FROM ejercicio e2
GROUP BY e2.sec) t ON
e1.tot=t.tm and AND t.sec = e1.sec;
Otra forma:
CREATE VIEW vps2 as
SELECT sec, MAX(tot) tot FROM vps
GROUP BY sec;
SELECT vps.* FROM vps JOIN vps2
on vps.sec= vps2.sec AND vps.tot = vps2.tot