Examen 2ev

 

 

CNAE (Clasificación Nacional de Actividades Económicas)

Mediante Heidi SQL importa los datos y con PHPMyAdmin concede los permisos al usuario examen para poder hacer SELECT sobre geo_normalizada.

  1. Hacer que el usuario examen tenga permisos de SELECT contra la base de datos geo_normalizada.
  2. En la base de datos TEST importar la tabla de CNAE 2009 CNAE 2009
DDL MySQL

[plegar]
DML
INSERT INTO estados VALUES 
  (DEFAULT,"Activa"),
  (DEFAULT,"Inactiva"),
  (DEFAULT,"Liquidada"),
  (DEFAULT,"Suspendida");
create table examen.semilla(
id int);
insert into examen.semilla values 
(1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
create table examen.numeros(
id int);
set @i:=0;
insert into examen.numeros
select @i:=@i+1 
from semilla s1 cross join semilla s2 
cross join semilla s3 cross join semilla s4
cross join semilla s5 cross join semilla s6;
INSERT INTO cnae VALUES (DEFAULT, "0000","SIN CLASIFICAR");
INSERT INTO comerciales VALUES 
(DEFAULT, "Juan","644 655 666","[email protected]","juan",MD5("juan"),null),
(DEFAULT, "Perico","666 655 644","[email protected]","perico",MD5("perico"),1),
(DEFAULT, "Andrés","633 622 611","[email protected]","andres",MD5("andres"),1),
(DEFAULT, "Amparito","622 655 699","[email protected]","amparito",MD5("amparito"),2),
(DEFAULT, "Gertrudis","600 600 600","[email protected]","ger",MD5("ger"),3),
(DEFAULT, "Genoveva","643 678 699","[email protected]","genoveva",MD5("genoveva"),5);

INSERT INTO clientes 
(cif,nombre,direccion,
web,email,telefono,latitud,
longitud,validado,fk_cnae,
fk_user,fk_estado,fk_comercial)
SELECT 
CONCAT(
  if(n.id%2=0,"A","B"),
  truncate(RAND()*10,0),
  truncate(RAND()*10,0),
  truncate(RAND()*10,0),
  truncate(RAND()*10,0),
  if(n.id>999,n.id,
    if(n.id>99,CONCAT("0",n.id),
      if(n.id>9,CONCAT("00",n.id),
         CONCAT("000",n.id))))) AS cif,
CONCAT("Cliente ",n.id) nombre,
CONCAT("C/ Del Cliente Nº",n.id) direccion,
CONCAT("cliente",n.id,".com") web,
CONCAT("info@cliente",n.id,".com") email,
CONCAT("9",
  truncate(RAND()*10,0),
  truncate(RAND()*10,0),
  truncate(RAND()*10,0),
  truncate(RAND()*10,0),
  if(n.id>999,n.id,
    if(n.id>99,CONCAT("0",n.id),
      if(n.id>9,CONCAT("00",n.id),
         CONCAT("000",n.id))))) AS telefono,
0,
0,
if(truncate(RAND()*5,0)%2=0,true,FALSE) validado,
1,
1,
1,
TRUNCATE(1+RAND()*3,0)
FROM numeros n LIMIT 9876;

INSERT INTO portales 
SELECT 
NULL,
CONCAT("sector",n.id,".com") dominio,
CONCAT("título del sector",n.id) titulo,
CONCAT("descripcion del sector",n.id) descripcion,
0,1,1,1
FROM numeros n LIMIT 1000;
INSERT INTO examen.regiones (nombre)
SELECT nombre FROM geo_normalizada.regiones
ORDER BY id;
INSERT INTO examen.provincias (nombre, fk_region)
SELECT nombre, fk_region FROM geo_normalizada.provincias
ORDER BY id;
INSERT INTO examen.comarcas (nombre)
SELECT nombre  FROM geo_normalizada.comarcas
ORDER BY id;
INSERT INTO examen.prov_comarca 
SELECT fk_comarca, fk_provincia 
FROM geo_normalizada.prov_comarcas;

INSERT INTO portales
SELECT null,
  concat(REPLACE(REPLACE(
       lower(replace(m.nombre,"'","-"))
       ," ","-"),"í","i"),".com") AS dominio,
  CONCAT_WS(" ","Portal de",m.nombre) as titulo,
  CONCAT_WS(" ","Directorio de empresas de",m.nombre) as
  descripcion,  0 visitas,  1 coeficiente, 2 , 1
FROM geo_normalizada.municipios m;
INSERT INTO municipios
SELECT null,
  m.nombre AS dominio,
  m.latitud,
  m.longitud,
  0,
  (select p.id from portales p where 
    substr(p.titulo,11) =m.nombre) AS fk_portal,
  m.fk_comarca,
  m.fk_provincia  
FROM geo_normalizada.municipios m;
INSERT INTO examen.localidades
SELECT NULL, l.nombre, l.fk_municipio
FROM geo_normalizada.localidades l;
INSERT INTO examen.cpostales
SELECT codpostal
FROM geo_normalizada.cod_postales;

INSERT INTO examen.cp_localidad
SELECT CP.fk_localidad, b.codpostal
FROM geo_normalizada.localidades_cp CP join 
geo_normalizada.cod_postales b
ON CP.fk_cod_postal = b.id;

INSERT INTO examen.cnae
SELECT NULL, c.cod_integrado,
c.titulo_cnae2009
FROM geo_normalizada.sector_cnae2009 c;
SET @i:= (SELECT COUNT(*) FROM cnae);
INSERT INTO sectores 
SELECT 
NULL,
CONCAT("sector",n.id) nombre,
truncate(RAND()*@i,0)+1 AS fk_cnae,
n.id AS fk_portal
FROM numeros n LIMIT 1000;
insert INTO campanas VALUES
(DEFAULT,"Default","https://x.com",1);

insert INTO publicidad VALUES
(DEFAULT,"https://x.com/slide.jpg",1,0,0,1),
(DEFAULT,"https://x.com/lateral.jpg",1,0,0,2),
(DEFAULT,"https://x.com/foot.jpg",1,0,0,3);
CREATE TABLE semilla4 
SELECT * FROM semilla LIMIT 4;
INSERT INTO anuncios 
SELECT NULL, 
ta.id AS fk_publicidad,
ta.id AS fk_tipo,
p.id AS fk_portal,
s4.id AS posicion
FROM tipos_anuncios as ta INNER join
publicidad pu
ON ta.id = pu.fk_tipo
cross JOIN
semilla4 s4 cross JOIN portales p ;
CREATE TABLE diccionario
(id INT, texto VARCHAR(100));
INSERT INTO diccionario VALUES
(1,"Navidad 2022"),
(2,"Navidad 2023"),
(3,"Black Friday 2022"),
(4,"Black Friday 2023"),
(5,"Rebajas Enero 2022"),
(6,"Rebajas Enero 2023"),
(7,"Rebajas Agosto 2022"),
(8,"Rebajas Agosto 2023"),
(9,"San Valentín 2022"),
(10,"San Valentín 2023"),
(11,"Carnaval 2022"),
(12,"Carnaval 2023"),
(13,"Publicidad corporativa 2022"),
(14,"Publicidad corporativa 2023");
INSERT INTO campanas
SELECT 
NULL,
CONCAT((SELECT texto
FROM diccionario d where
d.id = 1+(c.id MOD 14))," ",c.nombre) t1,
lower(
CONCAT("http://",replace(c.nombre," ",""),".com","/",
REPLACE((SELECT texto
FROM diccionario d where
d.id = 1+(c.id MOD 14))," ","") 
)
) t2,
c.id as fk
FROM clientes c
WHERE c.validado = TRUE;
INSERT INTO cargos (cargo) VALUES
("Gerente"),("Marketing"),("Financiero"),("Empleado");

UPDATE clientes
SET acronimo =
  if (id<10,
    CONCAT("CLT00",clientes.id),
     if (id<100, CONCAT("CLT0",clientes.id), CONCAT("CLT",clientes.id) )); INSERT INTO publicidad SELECT NULL AS id, concat(c.link,"/imagen-",t.ancho,"-",t.alto,".jpg") as link, c.id AS fk_campana, 0,0, t.id as fk_tipo FROM campanas c cross join tipos_anuncios t WHERE c.fk_cliente !=1; UPDATE anuncios A SET fk_publicidad = (SELECT id FROM publicidad P where A.fk_tipo = P.fk_tipo ORDER BY RAND() LIMIT 1) WHERE A.id MOD 50 = 0; INSERT INTO facturas SELECT DISTINCT NULL, SYSDATE(), c.fk_cliente FROM anuncios a JOIN publicidad p ON a.fk_publicidad = p.id JOIN campanas c ON p.fk_campana = c.id WHERE fk_cliente !=1; UPDATE facturas set fecha = DATE_ADD("2021/01/01",interval RAND()*720 DAY); INSERT INTO lineas_fac SELECT NULL AS id,f.fecha AS fecha_inicio, DATE_ADD(f.fecha,INTERVAL 12+ RAND()*12 MONTH) AS fecha_fin, f.id AS fk_factura, c.id AS fk_campana, tp.precio_base AS precio, a.id AS fk_anuncio FROM tipos_anuncios AS tp JOIN anuncios AS a ON tp.id = a.fk_tipo JOIN publicidad AS p ON a.fk_publicidad = p.id JOIN campanas AS c ON p.fk_campana = c.id JOIN clientes cl ON c.fk_cliente = cl.id JOIN facturas AS f ON cl.id = f.fk_cliente WHERE cl.id != 1; CREATE TABLE nombres ( id INT AUTO_INCREMENT PRIMARY KEY, nombre VARCHAR(30), apellido VARCHAR(30)); INSERT INTO nombres VALUES (DEFAULT,"María","Pedraza"), (DEFAULT,"Laura","Martínez"), (DEFAULT,"Felipe","Hermoso"), (DEFAULT,"Ramón","Villanueva"), (DEFAULT,"Lucio","Sobrino"), (DEFAULT,"Armando","Camorra"), (DEFAULT,"Isabel","Ayuso"), (DEFAULT,"Pedro","Piqueras"), (DEFAULT,"Rodolfo","Langostino"), (DEFAULT,"Pablo","Iglesias"), (DEFAULT,"Carmen","López"), (DEFAULT,"Remigio","Carpintero"), (DEFAULT,"Victoria","Abril"), (DEFAULT,"Joselín","Ubrique"), (DEFAULT,"Jesús","Gracias"), (DEFAULT,"Marcelino","Pan y Vino"), (DEFAULT,"Perico","Sánchez"); INSERT INTO contactos (nombre, telefono, fk_cliente, fk_cargo) SELECT CONCAT_WS(" ",(SELECT nombre FROM nombres ORDER BY RAND() LIMIT 1) , (SELECT apellido FROM nombres ORDER BY RAND() LIMIT 1) ) nombre, CONCAT("666",(SELECT id from numeros where id > 99999 ORDER BY RAND() LIMIT 1)) telefono,
    (SELECT id FROM clientes ORDER BY RAND() LIMIT 1) AS fk_clientes,
  (SELECT id FROM cargos ORDER BY RAND() LIMIT 1) AS fk_cargos
FROM numeros LIMIT 500;

UPDATE clientes 
SET fk_cnae = 
(SELECT id FROM cnae
ORDER BY RAND() LIMIT 1),
fk_cp = (SELECT codigo FROM cpostales
ORDER BY RAND() LIMIT 1)
WHERE TRUE;
--
UPDATE clientes C
SET fk_localidad = 
(SELECT CP.fk_localidad FROM cp_localidad CP
WHERE C.fk_cp = CP.fk_cp LIMIT 1);
--
UPDATE clientes C
SET fk_comercial = 
(SELECT id FROM comerciales 
ORDER BY RAND() LIMIT 1);
--
INSERT cliente_sector 
SELECT S.id, C.id FROM clientes C JOIN cnae CN 
ON C.fk_cnae = CN.id JOIN sectores S
ON CN.id = S.fk_cnae;


--
TRUNCATE crm;
INSERT IGNORE crm
SELECT DATE_ADD("2020/01/01",interval RAND()*1080 DAY),fk_comercial, id, 
  CONCAT("llamada telefónica al ", telefono)
FROM clientes 
WHERE validado = TRUE AND
  id MOD 2 =0
union
SELECT DATE_ADD("2020/01/01",interval RAND()*1080 DAY),fk_comercial, id, 
  CONCAT("envío de correo electrónico ", email)
FROM clientes 
WHERE id MOD 3 =0;

INSERT INTO visitas
SELECT NULL,
DATE_ADD("2020/01/01",INTERVAL N.id DAY),
truncate(RAND()*150,0),
P.id
FROM 
numeros N cross join portales P
WHERE N.id <=720;

UPDATE portales SET 
visitas = (SELECT 50+round(RAND()*300,0));

DROP TABLE numeros;

ALTER TABLE localidades
ADD COLUMN altura INT,
ADD COLUMN longitud decimal(10,6),
ADD COLUMN latitud decimal(10,6);
UPDATE localidades l
SET 
  altura = (SELECT altura FROM geo_normalizada.localidades m WHERE m.id = l.id),
  longitud = (SELECT round(longitud,4) FROM geo_normalizada.localidades m WHERE m.id = l.id),
  latitud = (SELECT round(latitud,4) FROM geo_normalizada.localidades m WHERE m.id = l.id);
  
ALTER TABLE municipios
ADD COLUMN altura INT AFTER longitud;

update  municipios m
SET  
  altura = (SELECT round(avg(altura),0) FROM geo_normalizada.localidades l WHERE l.fk_municipio = m.id),
  longitud = (SELECT round(avg(longitud),4) FROM geo_normalizada.localidades l WHERE l.fk_municipio = m.id),
  latitud = (SELECT round(avg(latitud),4) FROM geo_normalizada.localidades l WHERE l.fk_municipio = m.id);
  
UPDATE examen.municipios m
SET m.habitantes = (SELECT n.hab FROM geo_normalizada.municipios_hab n 
WHERE n.nombre = m.nombre)

UPDATE clientes c
SET c.fk_localidad = (SELECT cp.fk_localidad FROM cp_localidad cp WHERE cp.fk_cp=c.fk_cp LIMIT 1)

 

[plegar]

Preguntas de examen:

Listado de todos los clientes validados que no tienen asociado ningún anuncio a la publicidad de sus campañas:

SELECT * FROM clientes
WHERE id
NOT IN (SELECT DISTINCT C.fk_cliente
FROM anuncios A inner join publicidad P 
ON A.fk_publicidad = P.id INNER JOIN campanas C
ON P.fk_campana = C.id) AND
validado = TRUE;

[plegar]
Suma todas las facturas del cliente 69 por cada ejercicio

SELECT C.nombre, YEAR(F.fecha) AS ejer, 
  SUM(L.precio)
FROM clientes C join facturas F 
ON C.id = F.fk_cliente JOIN lineas_fac L
ON F.id = L.fk_factura
WHERE C.id=69
GROUP BY C.nombre, ejer;

[plegar]
Facturación de la empresa por ejercicios

SELECT YEAR(F.fecha) AS ejer, 
  SUM(L.precio) total
FROM facturas F JOIN lineas_fac L
ON F.id = L.fk_factura
GROUP BY ejer;

[plegar]
Listado con los mejores clientes:

SELECT id FROM
(SELECT C.id miid, SUM(L.precio) AS tot
FROM clientes C  join facturas F 
ON C.id = F.fk_cliente JOIN lineas_fac L
ON F.id = L.fk_factura
GROUP BY 1
HAVING SUM(L.precio)= 1500) AS t;

[plegar]

 

-- suma la facturación del comercial que más vendió
-- en la empresa sin contar los clientes de la 
-- Comunidad de Madrid (Región like "%Madrid%").
SELECT SUM(lf.precio) total, c.fk_comercial
FROM lineas_fac lf JOIN facturas f
ON lf.fk_factura = f.id RIGHT 
JOIN clientes_no_madrid c
ON f.fk_cliente = c.id
GROUP BY c.fk_comercial
ORDER BY total desc
/*DROP VIEW clientes_no_madrid;
CREATE VIEW clientes_no_madrid as
SELECT DISTINCT cl2.id, cl2.fk_comercial
FROM clientes cl2 JOIN localidades l
ON cl2.fk_localidad = l.id JOIN municipios m
ON l.fk_municipio = m.id JOIN provincias p
ON m.fk_provincia = p.id JOIN regiones r
ON p.fk_region = r.id
WHERE r.nombre NOT LIKE "%madrid%"*/

 

todo seguido …

SELECT SUM(lf.precio) total, c.fk_comercial
FROM lineas_fac lf JOIN facturas f
ON lf.fk_factura = f.id RIGHT JOIN clientes c
ON c.id = f.fk_cliente  JOIN localidades l
ON c.fk_localidad = l.id JOIN municipios m
ON l.fk_municipio = m.id JOIN provincias p
ON m.fk_provincia = p.id 
JOIN regiones r ON p.fk_region = r.id
WHERE r.nombre NOT like "%madrid%"
GROUP BY c.fk_comercial
ORDER BY total DESC;