TRABAJO REALIZADO POR IVÁN ALOS Y ADRIÁN GÓMEZ
ACTIVIDAD OBLIGATORIA II
Consulta variadas con la BBDD EMPRESA
Las consultas que sean multitablas realizadas con
INNER JOIN.
1. Realizar Un listado de clientes indicando el nombre del cliente y cuántos pedidos
ha realizado.
select c.nombrecliente,count(*) as numero_de_pedidos
from j_clientes c INNER JOIN j_pedidos p
on c.codigocliente = p.codigocliente
GROUP BY c.nombrecliente
HAVING COUNT(*) >=1
2. Obtener Un listado con los nombres de los clientes y el total pagado por cada uno
de ellos.
select c.nombrecliente,count(*) as numero_de_pedidos
from j_clientes c INNER JOIN j_pedidos p
on c.codigocliente = p.codigocliente
GROUP BY c.nombrecliente
HAVING COUNT(*) >=1
3. Sacar el nombre de los clientes que hayan hecho pedidos en 2008.
SELECT c.nombrecliente,p.fechapago
FROM j_pagos p inner JOIN j_clientes c
on p.codigocliente = c.codigocliente
WHERE p.fechapago BETWEEN '2008/01/01' and '2008/12/31';
4. Listar el nombre del cliente y el nombre y apellido de sus representantes, sólo
aquellos clientes que no hayan realizado pagos.
select c.nombrecliente,e.nombre,e.apellido1
from j_clientes c ,j_empleados e , j_pagos p
where c.codigoempleadorepventas = e.codigoempleado
and p.codigocliente (+)= c.codigocliente
and cantidad is null
1
5. Visualizar un listado de clientes donde aparezca el nombre del cliente,el nombre de
su comercial y la ciudad donde está su oficina.
SELECT e.nombre,e.apellido1,e.apellido2,o.ciudad,e.puesto
FROM j_empleados e inner join j_oficinas o
on e.codigooficina = o.codigooficina
where upper (e.puesto) != 'REPRESENTANTE VENTAS'
GROUP BY e.nombre,e.apellido1,e.apellido2,o.ciudad,e.puesto;
6. Sacar el nombre, apellidos, oficina y cargo de aquellos que no sean representantes
de ventas.
select nombre , apellido1 , apellido2 , puesto , codigooficina
from j_empleados
WHERE UPPER(puesto) not IN 'REPRESENTANTE VENTAS'
7. Obtener cuántos empleados tiene cada oficina, mostrando el nombre de la ciudad
donde está la oficina.
SELECT ciudad, COUNT(*)
from J_OFICINAS o INNER JOIN j_empleados e
on o.codigooficina = e.codigooficina
group by o.ciudad;
8. Listar el nombre, apellido, oficina (ciudad) y cargo del empleado que no represente
a ningún cliente.
SELECT e.nombre,e.apellido1,e.apellido2,o.ciudad,e.puesto
FROM j_empleados e inner join j_oficinas o
on e.codigooficina = o.codigooficina
where upper (e.puesto) != 'REPRESENTANTE VENTAS'
GROUP BY e.nombre,e.apellido1,e.apellido2,o.ciudad,e.puesto;
9. Sacar la media de unidades en stock de cada gama.
SELECT gama,avg(cantidadenstock) as media_gama
from j_productos
GROUP by gama;
2
10. Obtener el nombre de los clientes que residan en la misma ciudad donde hay una
oficina, indicando dónde está la oficina.
SELECT c.nombrecliente , o.ciudad ,o.codigooficina
FROM j_clientes c INNER join j_oficinas o
on c.ciudad = o.ciudad
11. Visualizarlos clientes que residan en ciudades donde no hay oficinas, ordenado
por la ciudad donde residen.
select nombrecliente ,c.ciudad , o.codigooficina
from j_clientes c left JOIN j_oficinas o
on c.ciudad = o.ciudad
where o.codigooficina is null;
12. Listarel nombre y el número de clientes que tiene asignado cada representante de
ventas.
SELECT e.nombre ,COUNT(codigoempleado)
FROM j_empleados e INNER JOIN j_clientes c
on e.codigoempleado= c.codigoempleadorepventas
WHERE UPPER(e.puesto) = 'REPRESENTANTE VENTAS'
GROUP BY e.nombre,codigoempleado;
13. Sacar cuál fue el cliente ( y la cantidad pagada) que hizo el pago con mayor
cuantía y el que hizo el pago con menor cuantía.
SELECT nombrecliente,p.cantidad
FROM j_clientes c INNER JOIN j_pagos p
on p.codigocliente = c.codigocliente
where p.cantidad = (SELECT max(cantidad)
FROM j_pagos
)or p.cantidad = (SELECT min(cantidad)
FROM j_pagos)
GROUP by c.nombrecliente,p.cantidad;
14. Realizar un listado con el código de pedido y el precio total de todas los
productos de cada pedido. (El total de cada pedido es la cantidad por el preciounidad)
SELECT p.codigopedido ,d.cantidad*d.preciounidad as precio_total
FROM j_pedidos p inner join j_detallepedidos d
on p.codigopedido = d.codigopedido
GROUP BY p.codigopedido ,d.cantidad*d.preciounidad
ORDER BY d.codigopedido asc
3
15. Sacar elcódigo y el nombre de los clientes que hayan hecho pedidos en el 2008
por una cuantía superior a 2000 euros.
SELECT DISTINCT c.codigocliente,c.nombrecliente , p.fechapedido ,d.preciounidad
FROM j_clientes c INNER JOIN j_pedidos p
on c.codigocliente = p.codigocliente INNER join j_detallepedidos d
on p.codigopedido = d.codigopedido
WHERE fechapedido BETWEEN '01/01/08' and '31/12/08' and d.preciounidad > 2000;
16. Sacar el nombre del cliente y cuántos pedidos tiene en cada estado.
SELECT c.nombrecliente,p.estado,COUNT(p.estado) as cada_estado
FROM j_clientes c INNER JOIN j_pedidos p
on c.codigocliente = p.codigocliente
GROUP BY c.nombrecliente,p.estado
ORDER BY nombrecliente
17. Visualiza el nombre de los clientes, nombre del producto y el total de las
cantidades pedidas de cada producto y que hayan pedido más de 200 unidades de
cualquier producto.
SELECT DISTINCT c.nombrecliente,pr.nombre,d.cantidad
FROM j_clientes c INNER JOIN j_pedidos p
on c.codigocliente = p.codigocliente INNER join j_detallepedidos d
on p.codigopedido = d.codigopedido inner JOIN j_productos pr
on d.codigoproducto =pr.codigoproducto INNER JOIN j_pedidos pe
on c.codigocliente =p.codigocliente
where d.cantidad >200
4
Las consultas que sean multitablas realizadas con
WHERE.
1. Realizar Un listado de clientes indicando el nombre del cliente y cuántos pedidos
ha realizado.
select c.nombrecliente, count (*) "Pedidos Realizados"
from j_pedidos p , j_clientes c
WHERE c.codigocliente = p.codigocliente
group by c.nombrecliente
2. Obtener Un listado con los nombres de los clientes y el total pagado por cada uno
de ellos.
SELECT c.nombrecliente, sum(p.cantidad)
from j_clientes c, j_pagos p
where c.codigocliente = p.codigocliente
group by c.nombrecliente
3. Sacar el nombre de los clientes que hayan hecho pedidos en 2008.
select distinct c.nombrecliente
from j_clientes c, j_pedidos p
where c.codigocliente = p.codigocliente and p.fechapedido like ‘%/08’
4. Listar el nombre del cliente y el nombre y apellido de sus representantes, sólo
aquellos clientes que no hayan realizado pagos.
select c.nombrecliente, e.nombre, e.apellido1, e.apellido2
from j_clientes c, j_pagos p, j_empleados e
where c.codigocliente = p.codigocliente (+) and c.codigoempleadorepventas =
e.codigoempleado and p.idtransaccion is null
5. Visualizar un listado de clientes donde aparezca el nombre del cliente,el nombre de
su comercial y la ciudad donde está su oficina.
select distinct c.nombrecliente, c.nombrecontacto, o.ciudad
from j_clientes c, j_oficinas o, j_empleados e
where c.codigoempleadorepventas = e.codigoempleado and e.codigooficina =
o.codigooficina
5
6. Sacar el nombre, apellidos, oficina y cargo de aquellos que no sean representantes
de ventas.
select distinct nombre, apellido1, apellido2, codigooficina
from j_empleados
where upper(puesto) not like 'REPRESENTANTE VENTAS'
7. Obtener cuántos empleados tiene cada oficina, mostrando el nombre de la ciudad
donde está la oficina.
select count(*), o.ciudad, o.codigooficina
from j_oficinas o, j_empleados e
where e.codigooficina = o.codigooficina
group by o.ciudad, o.codigooficina
8. Listar el nombre, apellido, oficina (ciudad) y cargo del empleado que no represente
a ningún cliente.
select distinct e.nombre, e.apellido1, e.apellido2,
o.ciudad, e.puesto
from j_empleados e, j_oficinas o, j_clientes c
where o.codigooficina = e.codigooficina
and e.codigoempleado = c.codigoempleadorepventas(+)
and c.nombrecontacto is null
9. Sacar la media de unidades en stock de cada gama.
select distinct avg(p.cantidadenstock), p.gama
from j_productos p
group by p.gama
10. Obtener el nombre de los clientes que residan en la misma ciudad donde hay una
oficina, indicando dónde está la oficina.
select distinct c.nombrecliente, o.ciudad, o.codigooficina
from j_clientes c, j_oficinas o, j_empleados e
where c.codigoempleadorepventas = e.codigoempleado
and e.codigooficina = o.codigooficina and o.ciudad =
c.ciudad
11. Visualizarlos clientes que residan en ciudades donde no hay oficinas, ordenado
por la ciudad donde residen.
select c.codigocliente, c.nombrecliente, c.ciudad
from j_clientes c, j_empleados e, j_oficinas o
where c.codigoempleadorepventas = e.codigoempleado and
e.codigooficina = o.codigooficina(+) and o.codigopostal is null
order by c.ciudad
6
12. Listar el nombre y el número de clientes que tiene asignado cada representante de
ventas.
select c.nombrecliente, (select count(c.nombrecliente)
from j_clientes c
where c.codigoempleadorepventas = e.codigoempleado and upper(puesto) =
'REPRESENTANTE VENTAS')
"TOTAL CLIENTES"
from j_clientes c, j_empleados e
where c.codigoempleadorepventas = e.codigoempleado and upper(puesto) =
'REPRESENTANTE VENTAS'
13. Sacar cuál fue el cliente ( y la cantidad pagada) que hizo el pago con mayor
cuantía y el que hizo el pago con menor cuantía.
select c.nombrecliente, p.cantidad
from j_pagos p, j_clientes c
where c.codigocliente = p.codigocliente and (p.cantidad = (select min(p.cantidad)from
j_pagos p)
or p.cantidad = (select max(p.cantidad) from j_pagos p))
14. Realizar un listado con el código de pedido y el precio total de todas los
productos de cada pedido. (El total de cada pedido es la cantidad por el preciounidad)
select j_p.codigopedido, sum(j_dp.cantidad*j_dp.preciounidad)
from j_pedidos j_p, j_detallePedidos j_dp
where j_dp.codigopedido = j_p.codigopedido
group by j_p.codigopedido
order by j_p.codigopedido
15. Sacar el código y el nombre de los clientes que hayan hecho pedidos en el 2008
por una cuantía superior a 2000 euros.
select c.codigocliente, c.nombrecliente,
sum(d.cantidad*d.preciounidad)
from j_clientes c, j_pedidos p, j_detallepedidos d
where c.codigocliente = p.codigocliente and p.codigopedido
= d.codigopedido and p.fechapedido like '%/08'
group by c.codigocliente, c.nombrecliente
having sum(d.cantidad*d.preciounidad) > 2000
7
16. Sacar el nombre del cliente y cuántos pedidos tiene en cada estado.
select distinct c.nombrecliente, p.estado, count(*) "TOTAL PEDIDOS"
from j_clientes c, j_pedidos p, j_detallepedidos d
where c.codigocliente = p.codigocliente and d.codigopedido = p.codigopedido
group by p.estado, c.nombrecliente
order by c.nombrecliente
17. Visualiza el nombre de los clientes, nombre del producto y el total de las
cantidades pedidas de cada producto y que hayan pedido más de 200 unidades de
cualquier producto.
select distinct c.nombrecliente, p.nombre, d.cantidad
from j_clientes c, j_productos p, j_detallepedidos d, j_pedidos j
where j.codigopedido = d.codigopedido and p.codigoproducto = d.codigoproducto and
c.codigocliente = j.codigocliente
and cantidad > 200
8
PRÁCTICA 5 - CONSULTAS MULTITABLAS BD
EMPRESA
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 c.nombrecliente, e.nombre, o.ciudad
FROM j_clientes c, j_empleados e, j_oficinas o
WHERE c.codigoempleadorepventas = e.codigoempleado
and e.codigooficina = o.codigooficina;
2. Sacar la misma información que en la pregunta anterior pero solo los clientes que
no hayan hecho pagos.
select c.nombrecliente, e.nombre, e.apellido1, o.ciudad, p.idtransaccion
from j_clientes c, j_pagos p, j_empleados e, j_oficinas o
where c.codigocliente = p.codigocliente (+) and c.codigoempleadorepventas =
e.codigoempleado and p.idtransaccion is null
3. Obtener un listado con el nombre de los empleados junto con el nombre de sus
jefes.
incompleta preguntar lo del jefe
SELECT nombre,codigojefe
FROM j_empleados
4. Obtener el nombre de los clientes a los que no se les ha entregado a tiempo un
pedido (FechaEntrega> FechaEsperada).
select c.nombrecliente, p.fechapedido, p.fechaentrega
from j_clientes c, j_pedidos p
where c.codigocliente = p.codigocliente and fechapedido < fechaentrega
SUBCONSULTAS VEHICULOS
1.- Se quiere visualizar el nombre del cliente, el teléfono y la matrícula del vehículo, de
todos aquellos clientes cuyo vehículo tenga un seguro de tipo “O” y que hayan tenido
accidentes del mismo tipo que el cliente cuyo DNI es “2”.
9
SELECT DISTINCT c.nombre, c.telefono, v.matricula
FROM s_clientes c INNER JOIN s_vehiculos v ON c.dni = v.dni INNER JOIN s_vehic_accid
va ON v.matricula = va.matricula
WHERE v.tipo_seguro = 'O' AND va.id_accidente IN (SELECT id_accidente
FROM s_clientes c INNER JOIN s_vehiculos v ON c.dni = v.dni INNER JOIN s_vehic_accid
va ON v.matricula = va.matricula
WHERE c.dni = 2) ;
2.- Visualizaremos la matrícula, marca, modelo, potencia, tipo de seguro, el dni del
propietario, nombre y teléfono del propietario (cliente) de todos los vehículos que
sean del mismo tipo de seguro y la misma potencia que los vehículos del cliente cuyo
DNI es “1”.
SELECT v.matricula, v.marca, v.modelo, v.potencia, c.dni, c.nombre, c.telefono
FROM s_clientes c INNER JOIN s_vehiculos v ON c.dni = v.dni
WHERE v.tipo_seguro IN (SELECT tipo_seguro
FROM s_clientes c INNER JOIN s_vehiculos v ON c.dni = v.dni
WHERE c.dni = 1) AND v.potencia IN (SELECT v.potencia
FROM s_clientes c INNER JOIN s_vehiculos v ON c.dni = v.dni
WHERE c.dni = 1);
3.- Se quiere visualizar la descripción del tipo de accidente que mayor no de
accidentes hayan tenido en el año 2003 y el no de accidente que ha tenido.
SELECT a.descr_accid,COUNT (a.descr_accid)
FROM S_tipos_accidentes a,s_vehic_accid va
WHERE va.id_accidente = a.id_accidente
and va.fecha_accidente
BETWEEN '01/01/2003' and '31/12/2003'
GROUP BY a.descr_accid
HAVING COUNT(a.descr_accid) = 3
4.- Listar el nombre y la matrícula de los coches de aquellos clientes que tengan 2 o
más vehículos asegurados
SELECT v.modelo,v.matricula
FROM s_vehiculos v ,s_clientes s
WHERE v.dni = s.dni
GROUP BY v.modelo,v.matricula
HAVING COUNT(v.tipo_seguro) >1;
segunda prueba
10
SELECT v.modelo,v.matricula, count(s.dni) as contador
FROM s_vehiculos v ,s_clientes s
WHERE v.dni = s.dni
GROUP BY v.modelo,v.matricula
having count(s.dni) > 1
PRÁCTICA 5 - SUBCONSULTAS BD EMPRESA
1. Obtener el nombre del producto más caro.
SELECT Nombre, Precioventa
FROM j_productos
WHERE Precioventa = (SELECT MAX(Precioventa) FROM j_productos);
forma 2 de hacerlo
SELECT DISTINCT nombre ,p.precioventa
FROM j_productos p , j_detallepedidos d
11
WHERE p.codigoproducto = d.codigoproducto and p.precioventa =(SELECT
max(precioventa)
FROM j_productos);
2. Obtener el nombre del producto del que más unidades se hayan vendido en un
mismo pedido.
SELECT nombre,pe.codigopedido
FROM j_productos p ,j_detallepedidos d,j_pedidos pe
WHERE d.codigoproducto = p.codigoproducto
and d.codigopedido = pe.codigopedido
and d.cantidad =(SELECT max(cantidad)
FROM j_detallepedidos)
¿no entiendo a que te refieres con las unidades que se hayan vendido en este pedido el
próximo dia te lo pregunto?
3. Obtener el nombre de los clientes cuyo límite de crédito sea mayor que los pagos
que haya realizado por ese cliente.
SELECT nombrecliente , c.limitecredito , p.cantidad
FROM j_clientes c, j_pagos p
WHERE p.codigocliente = c.codigocliente
and c.limitecredito > p.cantidad
4. Sacar el producto que más unidades tiene en stock y el que menos unidades tiene
en stock
SELECT DISTINCT nombre , cantidadenstock
FROM j_productos
WHERE cantidadenstock =(SELECT MAX(cantidadenstock)
FROM j_productos) OR cantidadenstock =(SELECT MIN(cantidadenstock)
FROM j_productos);
SUBCONSULTAS VENTAS
1. Listar las ventas de los vendedores, solo las ventas de aquellos artículos que
hayan sido vendidos por el vendedor cuyo DNI es “1”.
Columnas a listar: nombre del vendedor, fecha de la venta, descripción del artículo
y unidades vendidas. Ordenado por : nombre del vendedor, nombre del artículo y
fecha de la venta.
SELECT ve.nombre_vend ,a.descr_artic, v.fecha_venta ,v.unidades
FROM v_ventas v , v_vendedores ve ,v_articulos a
where v.dni = ve.dni and v.cod_articulo = a.cod_articulo
12
and ve.dni = '1'
ORDER BY ve.nombre_vend,a.descr_artic,v.fecha_venta;
2. Listar los artículos vendidos en las zonas que tenga asignadas el vendedor cuyo
nombre es ‘GOMEZ MARTINEZ, MARIA’.
Columnas : nombre del artículo, precio unitario y cantidad en almacén.
SELECT descr_artic,precio_unitario,cant_almac
FROM v_articulos a,v_ventas v,v_vendedores ve
WHERE v.cod_articulo = a.cod_articulo
and ve.dni = v.dni and UPPER(ve.nombre_vend) = 'GOMEZ MARTINEZ, MARIA'
3. Listar los nombres de los vendedores que hayan realizado alguna venta en la zona
cuyo nombre es ZONA TERCERA y cuyas cantidades vendidas sean menores que las
vendidas por el vendedor cuyo nombre es MUÑOZ GARCIA, LUIS del artículo MESAS
200 en la fecha 02/08/2000.
SELECT nombre_vend,v.fecha_venta
FROM v_vendedores ve , v_ventas v , v_zonas z,v_articulos a
WHERE ve.dni = v.dni
and z.cod_zona = v.cod_zona
AND a.cod_articulo = v.cod_articulo
and UPPER(z.nombre_zona) ='ZONA TERCERA'
and v.fecha_venta ='02/08/2000'
and ve.nombre_vend = 'MUÑOZ GARCIA,LUIS'
and a.descr_artic = 'MESAS 200';
4. Listar por cada artículo:
Código del artículo, la cantidad que hay en almacén (CANT_ALMAC), lo que se ha
vendido (suma las unidades vendidas de ese artículo) y lo que quedaría (se le resta
la cantidad en almacén menos la suma de lo que se ha vendido).
SELECT DISTINCT a.cod_articulo ,a.cant_almac,v.unidades,a.cant_almac-v.unidades as
lo_que_quedaria
FROM v_articulos a , v_ventas v
WHERE v.cod_articulo = a.cod_articulo
ORDER BY a.cod_articulo;
13