Está en la página 1de 6

use JARDINERIA;

-- Bloque 1
-- 1. Sacar el código de oficina y la ciudad donde hay oficinas
select CodigoOficina, ciudad from oficinas;
-- 2. Sacar cuántos empleados hay en la compañía
select count(CodigoEmpleado) from empleados;
-- 3. Sacar cuántos clientes tiene cada país
select pais, count(codigocliente) from clientes
group by pais;
-- 4. Sacar cuál fue el pago medio en 2005
select avg(Cantidad) from pagos
where FechaPago between '2008-01-01' and '2008-12-31' ;
describe pagos;
select * from pagos;
-- 5. Obtener el nombre del cliente con mayor límite de crédito
select nombrecliente, LimiteCredito from clientes
where LimiteCredito = (select max(LimiteCredito) from clientes);
-- 6. Obtener el nombre, apellido1 y cargo de los empleados que no representen a
ningún cliente
select e.nombre, concat(e.apellido1, ' ', e.apellido2) as Apellidos,
e.puesto, c.CodigoEmpleadoRepVentas from empleados as e
left join clientes as c
on CodigoEmpleadoRepVentas is null;
-- 7. Sacar un listado con el nombre de cada cliente y el nombre y apellido de su
representante de ventas
select c.nombrecliente, e.nombre, concat(e.apellido1, ' ', e.apellido2) as
Apellidos from empleados as e
inner join clientes as c
on c.CodigoEmpleadoRepVentas=e.codigoempleado;
-- 8. Mostrar el nombre de los clientes que no hayan realizado pagos junto con el
nombre de sus representantes de
-- ventas
describe pagos;
select * from empleados;
select * from pagos;
select nombreCliente from clientes
where CodigoEmpleadoRepVentas is null;
-- 9. Listar las ventas totales de los productos que hayan facturado más de 3000
euros. Se mostrará el nombre,
-- unidades vendidas, total facturado y total facturado con impuestos (21% IVA)
-- select * from detallepedidos;
select p.nombre, sum(dp.preciounidad*dp.cantidad) as facturado, sum(dp.cantidad) as
unidadesVendidas,
sum((dp.preciounidad*dp.cantidad)+((dp.preciounidad*dp.cantidad)*0.21)) as conIVA
from detallepedidos as dp inner join productos as p
on p.CodigoProducto=dp.CodigoProducto
group by p.nombre
having facturado>3000;
-- 10. Listar la dirección de las oficinas que tengan clientes en Fuenlabrada
select * from oficinas;
select * from empleados;
select * from clientes;

select concat(o.ciudad,',',o.pais,',',o.region) as direccion from oficinas as o


inner join empleados as e on e.codigooficina=o.codigooficina
inner join clientes as c on e.codigoempleado=c.CodigoEmpleadoRepVentas and
c.ciudad='Fuenlabrada' group by o.CodigoOficina;

select count(ciudad) from clientes where ciudad='Fuenlabrada' group by ciudad;


-- 11. Sacar el cliente que hizo el pedido de mayor cuantía

select codigopedido, sum(preciounidad*cantidad) as cuantia from detallepedidos


group by codigopedido;

select c.nombrecliente ,sum(dp.preciounidad*dp.cantidad) as MaxCuant from


detallepedidos as dp
inner join pedidos as p on p.codigopedido=dp.codigopedido
inner join clientes as c on c.codigocliente=p.codigocliente
group by p.codigopedido
having maxcuant=(select max(cuantia) from (select sum(preciounidad*cantidad) as
cuantia from detallepedidos
group by codigopedido) as max);

select max(cuantia) from (select sum(preciounidad*cantidad) as cuantia from


detallepedidos
group by codigopedido) as max;

select codigopedido from detallepedidos group by codigopedido having


sum(cantidad*precioUnidad)= (select max(cuantia) from (select
sum(preciounidad*cantidad) as cuantia from detallepedidos
group by codigopedido)as max) ;

select codigocliente from pedidos where codigopedido in (select codigopedido from


detallepedidos group by codigopedido having sum(cantidad*precioUnidad)= (select
max(cuantia) from (select sum(preciounidad*cantidad) as cuantia from detallepedidos
group by codigopedido)as max));

-- create view vcuantia as (select codigopedido, sum(cantidad*PrecioUnidad) as


cuantia from detallepedidos group by codigopedido) as cuantia);

-- Bloque 2
-- 1. Sacar la ciudad y el teléfono de las oficinas de Estados Unidos
select ciudad, telefono from oficinas
where pais='EEUU';
-- 2. Sacar el nombre, los apellidos y el email de los empleados a cargo de Alberto
Soria
select nombre, concat(apellido1,' ',apellido2) as apellidos, email from empleados
where codigojefe in (select codigoempleado from empleados where puesto like
'Director General');
-- select count(*) from empleados where codigojefe=3;
-- select count(*) from (select nombre, concat(apellido1,' ',apellido2) as
apellidos, email from empleados
-- where codigojefe=(select codigoempleado from empleados where nombre='Alberto'
and apellido1='Soria')) as comp;

select e1.nombre, concat(e1.apellido1,' ', e1.apellido2) as apellidos, e1.email


from empleados as e1
inner join empleados as e2 on e1.codigoJefe = e2.codigoempleado where e2.nombre =
'Alberto' and e2.apellido1='Soria';

-- 3. Sacar el cargo, nombre, apellidos y email del jefe de la empresa


select Puesto, nombre, concat(apellido1,' ',apellido2) as apellidos, email from
empleados
where codigojefe is null;

-- select * from empleados where codigoJefe is null;

-- Select * from empleado where codigoJefe = codigoEmpleadod

-- Select from empleado where puestoTrabajo='Director General';

-- select * from empleados where codigoJefe = codigoEmpleado.


-- 4. Sacar el número de clientes que tiene la empresa

select count(*) from clientes;

select count(codigocliente) from clientes; -- ¿Cuantos clientes tienen código de


cliente?

-- 5. Sacar cuántos clientes tiene cada país


select pais, count(codigocliente) from clientes
group by pais;

select pais, count(*) from clientes


group by pais;

-- 6. Sacar cuántos clientes tiene la ciudad de Madrid

select count(*) from clientes where ciudad = 'Madrid';

select ciudad, count(codigocliente) from clientes


group by ciudad
having ciudad='Madrid';

-- 7. Sacar el código de empleado y el número de clientes al que atiende cada


representante de ventas
select codigoempleadorepventas, count(*) from clientes
group by codigoempleadorepventas;

select empleados.nombre, count(*) from empleados


inner join clientes
on clientes.codigoempleadorepventas = empleados.codigoEmpleado
group by clientes.codigoempleadorepventas;

-- 8. Sacar el número de clientes que no tienen asignado representante de ventas

select count(*) from clientes


where codigoempleadorepventas is null;

select count(codigoempleadorepventas) from clientes;


-- 9. Sacar cuántos productos existen en cada línea de pedido
select NumeroLinea, CodigoPedido, count(codigoproducto) from detallepedidos
group by NumeroLinea, CodigoPedido;

select count(*) from detallepedidos;

select Cantidad, NumeroLinea, CodigoPedido from detallepedidos;

select CodigoProducto, sum(Cantidad) from detallepedidos group by CodigoProducto;

-- 10. Sacar el número de pedido, código de cliente, fecha requerida y fecha de


entrega de los pedidos cuya fecha de
-- entrega ha sido al menos dos días antes de la fecha requerida (Pista: función
addDate de MySQL)
select codigopedido, codigocliente,fechaesperada, fechaentrega from pedidos
where fechaentrega>=AddDate(fechaesperada, interval 2 day);

-- 11. Sacar la facturación que ha tenido la empresa en toda la historia, indicando


la base imponible, el IVA y el total
-- facturado. La base imponible se calcula sumando el coste del producto por el
número de unidades vendidas. El
-- IVA es el 21% de la base imponible y el total, la suma de los dos campos
anteriores
select sum(preciounidad*cantidad) as BaseImponible,
sum((preciounidad*cantidad)*0.21) as iva,
sum((preciounidad*cantidad)+((preciounidad*cantidad)*1.21)) as total
from detallepedidos;

-- 12. Sacar la misma información que en la pregunta anterior, pero agrupada por
código de producto filtrada por los
-- códigos que empiecen por FR

select sum(preciounidad*cantidad) as BaseImponible,


sum((preciounidad*cantidad)*0.21) as IVA,
sum((preciounidad*cantidad)-((preciounidad*cantidad)*0.21)) as total from
detallepedidos
where CodigoProducto like 'FR%' group by codigoProducto;

-- Bloque 3
-- 1. Obtener el nombre del producto más caro
select nombre, PrecioVenta from productos
where precioventa = (select max(PrecioVenta) from productos);

-- 2. Obtener el nombre del producto del que más unidades se hayan vendido en un
mismo pedido
-- select * from productos;

select p.nombre, sum(dp.cantidad) from productos as p


inner join detallepedidos as dp on p.codigoproducto=dp.codigoproducto
group by p.nombre
having sum(dp.cantidad)= (select max(cant) from (select sum(cantidad) as cant from
detallepedidos group by codigoproducto) as P);

select codigopedido, max(cantidad) as cant from detallepedidos group by


codigopedido;

select distinct codigopedido, max(cantidad) as cant from detallepedidos;

-- 3. Obtener los clientes cuya línea de crédito sea mayor que los pagos que haya
realizado

-- 3.1 Total de pagos realizados por cliente


select CodigoCliente, sum(Cantidad) from pagos group by CodigoCliente;
-- 3.2 Hago inner join
select C.CodigoCliente, C.limitecredito,sum(p.cantidad) from clientes c
inner join pagos p
on P.CodigoCliente = C.CodigoCliente
group by P.CodigoCliente, C.limitecredito
having limitecredito > sum(p.cantidad);

describe clientes;
describe pagos;

-- 4. Sacar el producto que más unidades tiene en stock y el que menos unidades
tiene en stock
select nombre, CantidadEnStock from productos
where CantidadEnStock =(select min(CantidadEnStock) from productos)
or CantidadEnStock =(select max(CantidadEnStock) from productos);
-- select max(CantidadEnStock), min(CantidadEnStock) from productos;
-- select CantidadEnStock from productos;

-- Bloque 4
-- 1. Sacar el nombre de los clientes y el nombre de sus representantes junto con
la ciudad de la oficina a la que
-- pertenece el representante
select cli.nombrecliente, of.ciudad from clientes as cli
inner join empleados as em on em.codigoempleado=cli.codigoempleadorepventas
inner join oficinas as of on em.codigoOficina=of.codigoOficina;

-- 2. Sacar la misma información que en la pregunta anterior pero sólo los clientes
que no hayan hecho pagos
select * from detallepedidos;
select * from pagos;

-- 3. Obtener el nombre de los clientes a los que no se les ha entregado a tiempo


un pedido
-- (fechaEntrega>FechaEsperada)
select cli.nombrecliente, fechaEntrega, FechaEsperada
from pedidos as p
inner join clientes as cli on cli.codigocliente=p.codigocliente and
p.fechaEntrega>p.FechaEsperada;
select * from pedidos;

-- Bloque5
-- 1. Sacar el número de clientes que tiene asignado cada representante de ventas
-- op. hard
select em.nombre, count(cli.codigocliente) from clientes as cli
inner join empleados as em on em.codigoempleado=cli.codigoempleadorepventas
group by em.codigoempleado;
-- op. easy
select count(codigocliente) as TotalClientes, codigoempleadorepventas
from clientes group by codigoempleadorepventas;
-- 2. Sacar cuántos pedidos tiene cada cliente en cada estado
-- op. easy
select codigocliente, count(codigopedido) as TotalPedidos
from pedidos
group by codigocliente;
-- op. hard
select cli.nombrecliente, count(p.codigopedido) as TotalPedidos from pedidos as p
inner join clientes as cli on cli.codigocliente=p.codigocliente
group by cli.codigocliente;

-- Bloque 6
-- 1. Sacar el importe medio de los pedidos de la BBDDjardineria
select avg(cuantia) from (select sum(preciounidad*cantidad) as cuantia from
detallepedidos
group by codigopedido) as AllPedidos;
-- 2. ¿Cuál es el pedido más caro del empleado que más clientes tiene?
select codigopedido, sum(preciounidad*cantidad) from detallepedidos
group by codigopedido
having sum(preciounidad*cantidad)=(select max(valorPedido)
from (select p.codigopedido , sum(dp.preciounidad*dp.cantidad) as valorPedido,
cli.codigoempleadorepventas, count(cli.codigocliente) from pedidos as p
inner join detallepedidos as dp on p.codigopedido=dp.codigopedido
inner join clientes as cli on p.codigocliente=cli.codigocliente
group by p.codigopedido
having count(cli.codigocliente)=(select max(total) from (select
count(codigocliente) as total from clientes
group by codigoempleadorepventas) as numclient)) as totalPedidos);

También podría gustarte