Está en la página 1de 16

María del Pilar Alonso Suela

1º damel

Tarea 4 base de datos


Para poder realizar las actividades tenemos que importar las tablas y los datos de la
tarea, esto lo haremos de la siguiente manera:

1. Crearemos un usuario denominado Pilar le añadiremos una contraseña y


hacemos click en create workspace.

Nos desconectamos y nos vamos al terminal de SQL donde ejecutaremos los


comandos.

Nos conectamos a la base de datos


Importamos las tablas desde la ruta donde las tenemos guardadas

E importamos los datos, ahora sí podemos realizar las consultas requeridas en la actividad
Me logeo en la aplicación para comenzar a realizar las consultas

ACTIVIDADES

1. Número e importe de todos los pedidos realizados en los últimos 60 días.

SELECT p.NUM "NUMERO",

p.TOTAL "IMPORTE"

FROM PEDIDOS p

WHERE p.fecha BETWEEN SYSDATE AND SYSDATE-60;

2. Número e importe de los pedidos cuyo importe esté entre 100 y 200 €

SELECT p.NUM "NUMERO",

p.TOTAL "IMPORTE ENTRE 100 Y 200"

FROM PEDIDOS p

WHERE p.TOTAL BETWEEN 100 AND 200;

3. Código y nombre de los productos ordenados ascendentemente por


precio y nombre.

SELECT p.CODIGO "CODIGO",


p.NOMBRE "NOMBRE"

FROM PRODUCTOS p

ORDER BY p.precio,

p.nombre ASC;

4. Clientes cuyo segundo apellido sea Perez.

SELECT c.apellidos FROM CLIENTES c

WHERE c.apellidos LIKE '%Perez%';

5. Número total de productos que vende la empresa (en la columna debe


aparecer “Nº de productos”)

SELECT COUNT(*) AS "Nº DE PRODUCTOS"

FROM PRODUCTOS;

6. Número total de productos que no han sido pedidos

SELECT count(*) "Nº DE PRODUCTOS NO PEDIDOS"

FROM LINEAS l

RIGHT JOIN PRODUCTOS p ON p.codigo=l.producto

WHERE l.num_pedido IS NULL;

7. De cada pedido, mostrar su número, importe y datos del cliente

SELECT p.NUM "NÚMERO DE PEDIDO",

p.total "IMPORTE",

c.*

FROM PEDIDOS p
JOIN CLIENTES c ON p.cliente=c.codigo;

8. Código, nombre del cliente y número total de pedidos que ha hecho


cada cliente, ordenado de más a menos pedidos

SELECT c.codigo "codigo",

c.nombre "NOMBRE",

COUNT(p.cliente) "NUMERO DE PEDIDOS"

FROM CLIENTES c

JOIN PEDIDOS p ON c.codigo=p.cliente

GROUP BY c.codigo,

c.nombre

ORDER BY COUNT(p.cliente) DESC;

9. Código, nombre del cliente y número total de pedidos que ha realizado cada
cliente durante 2016

SELECT c.codigo "codigo",

c.nombre "NOMBRE",

COUNT(p.cliente) "NUMERO DE PEDIDOS"

FROM CLIENTES c

JOIN PEDIDOS p ON c.codigo=p.cliente

WHERE p.fecha BETWEEN to_date('01-01-2016', 'dd-mm-yyyy') AND


to_date('31-12-2016', 'dd-mm-yyyy')

GROUP BY c.codigo,

c.nombre ;

10. Código, nombre y número total de pedidos de los clientes que han
realizado más de un pedido
SELECT c.codigo "CODIGO",

c.nombre "NOMBRE",

COUNT(p.cliente) "NUMERO DE PEDIDOS"

FROM CLIENTES c

JOIN PEDIDOS p ON c.codigo=p.cliente

GROUP BY c.codigo,

c.nombreHAVING count(p.num)>1 ;

11. Para cada pedido mostrar su número, código del cliente y nº total de
líneas que tiene .

SELECT p.num "NUMERO PEDIDO",

p.cliente "CLIENTE",

COUNT(l.num_pedido) "NUMERO DE LÍNEAS"

FROM PEDIDOS p

JOIN LINEAS l ON p.num=l.num_pedido

GROUP BY p.num,

p.cliente;

12. Código de cliente, nombre de producto y cantidad total que ha pedido cada
cliente de cada producto

SELECT c.codigo "CLIENTE",

p.nombre"NOMBRE PRODUCTO",

sum(l.cantidad) "Nº PRODUCTOS PEDIDOS"

FROM productos p

JOIN lineas l ON p.codigo = l.producto

JOIN pedidos pe ON pe.num = l.num_pedidoJOIN clientes c ON


pe.cliente = c.codigo
GROUP BY c.codigo,

p.nombre;

13. Para cada cliente mostrar su código, nombre , numero e importe del cada
uno de sus pedidos

SELECT c.codigo "CLIENTE",

c.nombre "NOMBRE",

p.num "NÚMERO DE PEDIDO",

p.TOTAL "IMPORTE"

FROM CLIENTES c

JOIN PEDIDOS p ON c.codigo=p.cliente;

14. Para cada cliente menor de edad mostrar su código y nombre, el importe
más alto, el más bajo de los pedidos que ha realizado

SELECT c.CODIGO "CODIGO",

c.NOMBRE "NOMBRE",

MAX(p.TOTAL) "IMPORTE MÁS ALTO",

MIN(p.TOTAL) "IMPORTE MÁS BAJO"

FROM CLIENTES c

JOIN PEDIDOS p ON c.codigo=p.cliente GROUP BY c.codigo,

c.nombre;

15. Mostrar el código del producto, el nº de veces que ha sido pedido y la


cantidad total de unidades que se han pedido (los que no hayan sido pedidos
también deben ser mostrados con estos valores a 0) (combinación externa)

SELECT p.codigo,

count(l.producto) "NUMERO DE VECES PEDIDO",


sum(NVL(l.cantidad, 0)) "CANTIDAD VENDIDA"

FROM lineas l

RIGHT JOIN productos p ON p.codigo = l.producto

GROUP BY p.codigo;

16. Datos del producto del que más unidades se han pedido

SELECT MAX(SUMA) "CANTIDAD MÁXIMA"

FROM

(SELECT p.CODIGO AS CODIGO,

SUM(l.cantidad) AS SUMA

FROM productos p

JOIN LINEAS l ON p.codigo=l.producto

GROUP BY p.CODIGO);

No he conseguido mostrar todos los datos del producto.

17. Datos del producto más caro del pedido 1

SELECT *

FROM

(SELECT p.*

FROM productos p

JOIN lineas l ON l.producto = p.codigo

JOIN pedidos pe ON l.num_pedido = pe.num

WHERE pe.num = 1

ORDER BY p.precio DESC)


WHERE ROWNUM =1;

18. Datos del producto más caro de cada pedido (con una consulta
correlacionada)

SELECT *

FROM PRODUCTOS p

WHERE p.precio IN

(SELECT MAX(p.precio)

FROM PRODUCTOS p

JOIN LINEAS l ON p.codigo=l.producto

GROUP BY l.num_pedido) ;

19. Código de cada cliente y cantidad total que se ha gastado en 2016

SELECT c.codigo AS CODIGO,

SUM(pe.total)

FROM clientes c

JOIN pedidos pe ON pe.cliente = c.codigo

WHERE pe.fecha BETWEEN to_date('01-01-2016', 'dd-mm-yyyy') AND


to_date('31-12-2016', 'dd-mm-yyyy')

GROUP BY CODIGO,

pe.cliente

ORDER BY CODIGO;

20. Cantidad total gastada y código de cliente de los que menos han
gastado en 2016

Voy a acotarlo en los tres clientes que menos han gastado.


SELECT *

FROM

(SELECT c.codigo AS CODIGO,

SUM(pe.total) AS SUMA

FROM clientes c

JOIN pedidos pe ON pe.cliente = c.codigo

WHERE pe.fecha BETWEEN to_date('01-01-2016', 'dd-mm-yyyy')


AND to_date('31-12-2016', 'dd-mm-yyyy')

GROUP BY CODIGO,

pe.cliente

ORDER BY SUMA ASC)

WHERE ROWNUM <=3;

21. Para cada cliente mostrar su código y la suma total de sus pedidos y
gastos de envÍo

SELECT pe.cliente,

COUNT(pe.num),

SUM(NVL(pe.gastos_envio, 0))

FROM pedidos pe

GROUP BY pe.cliente;

22. Número de pedido , importe y cliente de los pedidos que no tienen gastos
de envío (debe aparecer un 0 en la columna de gastos de envío y pon una
etiqueta a ese campo)

SELECT pe.num,

pe.total,
pe.cliente,

NVL(pe.gastos_envio, 0)

FROM pedidos pe

WHERE pe.gastos_envio IS NULL ;

23. Datos del pedido más caro y del más barato

El más caro

SELECT *

FROM

(SELECT *

FROM PEDIDOS p

ORDER BY p.total DESC)

WHERE ROWNUM =1;

El más barato

SELECT *

FROM

(SELECT *

FROM PEDIDOS p

ORDER BY p.total ASC)

WHERE ROWNUM =1;

24. Sentencia que muestre los productos con este formato


CODIGO_PROD NOMBRE PRECIO

10001--------------- Pantalón --------50

10002--------------- Pantalón Pitillo --------60

10003--------------- Pantalón Campana --------55

20001--------------- Camisa M/L --------65

SELECT LPAD(p.codigo, 15, '-') "CODIGO",

p.nombre "NOMBRE",

LPAD(p.precio, 8, '-') "PRECIO"

FROM productos p;

25. Escribe los datos de los pedidos y su clientes con el siguiente formato:
Nº Pedido Fecha Pedido Nombre Completo

1 jueves : 10/octubre /2015 Garcia Perez, Luis

2 lunes : 10/febrero /2016 Garcia Perez, Luis

3 jueves : 20/febrero /2016 Garcia Perez, Luis

4 martes : 25/marzo /2016 Lopez Garrido, Maria

5 martes : 25/marzo /2016 Gamez Valiente, Javier

SELECT p.num "Nº Pedido",

to_char(p.fecha, 'day : dd/month/yyyy')"Fecha Pedido",

c.apellidos ||', '|| c.nombre "Nombre Completo"

FROM pedidos p

JOIN clientes c ON c.codigo = p.cliente;

26. (Solo con subconsultas, sin combinar tablas) Datos de los clientes que han
pedido el producto de nombre ‘PANTALON’.

SELECT c.*

FROM clientes c

WHERE c.codigo IN

(SELECT c.codigo

FROM lineas l,
pedidos pe,

productos p

WHERE c.codigo = pe.cliente

AND pe.num = l.num_pedido

AND l.producto = p.codigo

AND p.nombre='PANTALON' );

27. (Sin subconsultas) Datos de los clientes que han pedido el producto de
nombre ‘PANTALON’.

SELECT c.*,

p.nombre

FROM lineas l

JOIN productos p ON l.producto = p.codigo

JOIN pedidos pe ON pe.num = l.num_pedido

JOIN clientes c ON c.codigo = pe.cliente

WHERE p.nombre='PANTALON' ;

28. Para cada cliente, mostrar los datos del pedido cuyo importe sea superior
al importe l medio de sus pedidos

SELECT *

FROM PEDIDOS pe

WHERE pe.total>

(SELECT AVG(SUM(pe.total))

FROM PEDIDOS pe

GROUP BY pe.cliente) ;
29. Lista de todos los pedidos con mostrando también los días previstos de
espera para el envío

SELECT pe.*,

pe.fecha_prevista- pe.fecha "DÍAS PREVISTOS DE ESPERA"

FROM pedidos pe;

30. Pedidos con el mínimo nº de días previsto de espera.

SELECT pe.*

FROM pedidos pe

WHERE pe.fecha_prevista- pe.fecha=

(SELECT MIN(pe.fecha_prevista- pe.fecha)

FROM PEDIDOS pe);

También podría gustarte