0% encontró este documento útil (0 votos)
105 vistas10 páginas

Consultas SQL para Gestión de Pedidos

1. El documento contiene consultas SQL para realizar diversas operaciones sobre tablas de una base de datos de pedidos. 2. Se realizan consultas para filtrar, ordenar y agrupar datos de las tablas de pedidos, productos y clientes. 3. Las consultas incluyen operaciones como seleccionar, unir, agregar y ordenar columnas de las diferentes tablas.

Cargado por

pilar Alonso
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
105 vistas10 páginas

Consultas SQL para Gestión de Pedidos

1. El documento contiene consultas SQL para realizar diversas operaciones sobre tablas de una base de datos de pedidos. 2. Se realizan consultas para filtrar, ordenar y agrupar datos de las tablas de pedidos, productos y clientes. 3. Las consultas incluyen operaciones como seleccionar, unir, agregar y ordenar columnas de las diferentes tablas.

Cargado por

pilar Alonso
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

Corrección base de datos

SELECT * FROM PEDIDOS p WHERE [Link]>=sysdate-60;

select [Link] as NUMERO_PEDIDO ,[Link] AS TOTAL from pedidos p where [Link] between
100 and 200;

/* Código y nombre de los productos ordenados ascendentementepor precio y nombre.*/

SELECT [Link],[Link] FROM PRODUCTOS p ORDER BY [Link] ;

/*Clientes cuyo segundo apellido sea Perez*/

SELECT * FROM CLIENTES c WHERE [Link] LIKE '%_Perez';

/*Número total de productos que vende la empresa (en la columna debe aparecer “Nº de
productos”)*/

select count([Link])"numero_total" from PRODUCTOS p;

productos no pedidos una forma

SELECT * from productos p LEFT JOIN lineas l on [Link]=[Link] WHERE [Link] is null;
 De cada pedido, mostrar su número, importe y datos del cliente

SELECT [Link],[Link],[Link],[Link],[Link],[Link] FROM PEDIDOS pe inner


join CLIENTES c ON [Link]=[Link] ;

Código, nombre del cliente y número total de pedidos que ha hecho cada cliente, ordenado de
más a menos pedidos

select count([Link]) as numero_pedidos,[Link] from CLIENTES c JOIN PEDIDOS pe on


[Link]=[Link] group by [Link] ORDER BY numero_pedidos desc;

Código, nombre del cliente y número total de pedidos que ha hecho cada cliente, ordenado de
más a menos pedidos

select count([Link]) as numero_pedidos,[Link],[Link] from CLIENTES c JOIN PEDIDOS


pe on [Link]=[Link] group by [Link],[Link] ORDER BY numero_pedidos desc;

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

SELECT [Link],[Link],count([Link]) as numero_pedidos from PEDIDOS pe JOIN


CLIENTES c ON [Link]=[Link] where [Link] LIKE '%16' group by [Link],[Link];

Código, nombre y número total de pedidos de los clientes que han realizado más de un pedido

select [Link],[Link],count([Link]) as numero_pedidos from pedidos pe join clientes c


on [Link]=[Link] group by [Link],[Link] HAVING COUNT([Link])>1;

//duda , si pongo having ‘’alias’’ no funciona

Para cada pedido mostrar su número, código del cliente y nº total de líneas que tiene .
select [Link],[Link] as codigo_cliente,count([Link])as numero_lineas from pedidos pe
join lineas l on [Link]=l.num_pedido group by [Link],[Link];

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

select [Link] as cliente,[Link],sum([Link])as cantidad_total from clientes c join


pedidos pe ON [Link]=[Link]

join lineas l on [Link]=l.num_pedido

join productos p on [Link]=[Link]

group by [Link],[Link];

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

select [Link],[Link],l.num_pedido as numero_pedido,[Link] as importe_pedido


from clientes c join pedidos p on

[Link]=[Link]

join lineas l on

[Link]=l.num_pedido;

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 [Link],[Link],MAX([Link]) AS IMPORTE_MAS_ALTO,MIN([Link]) AS


IMPORTE_MAS_BAJO FROM CLIENTES C JOIN PEDIDOS PE ON [Link]=[Link]

WHERE [Link]<18

GROUP BY [Link],[Link] ;
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 [Link],COUNT([Link]) AS NUMERO_VECES_PEDIDO,


NVL(SUM([Link]),0) AS CANTIDAD FROM PRODUCTOS P LEFT JOIN LINEAS L ON
[Link]=[Link] GROUP BY [Link];

Muy buena tarea. En el apartado 16 para poder mostrar todos los datos del
producto puedes hacer que te devuelva el código que cumple la condición que
estás buscando (producto que más unidades ha vendido) y después hacer otra
consulta que sea la que muestre todos los datos (*) where codigo=código_buscado.

¡Ánimo para la siguiente tarea!

16
SELECT MAX(SUMA) "CANTIDAD MÁXIMA" FROM (SELECT [Link] AS CODIGO,
SUM([Link]) AS SUMA FROM productos p JOIN LINEAS l ON [Link]=[Link] GROUP BY
[Link]);

RESPUESTA DEL PROFESOR

Buenos días,
Vamos a intentar dividir el problema: Nos dicen que necesitamos los datos del producto
(todos=*) que más unidades se han vendido:
1- Averiguar cual es el número máximo de productos vendidos. Hay que ver todas las
líneas agrupadas por productos, sumarlas y seleccionar el máximo.
2- Una vez tenemos el máximo (6 veces) tenemos que obtener el producto (código) cuya
suma es el resultado de la anterior consulta (6).
3- La consulta anterior dará como resultado un código de producto, por lo que vamos a
volver a hacer una consulta que nos devuelva todos los datos del producto (lo que
buscamos) donde el código= cod_producto de la consulta anterior.

Como resumen:
a) Buscar el numero máximo de productos
b) Buscar el codigo de producto que coincida con el numero máximo de productos
c) Devolver todos los datos (*) que coincida con el cod_producto anterior.

Espero que se entienda la explicación. Si no, me lo comentas y te lo vuelvo a decir o te


paso la solución para que la analices.

Un saludo
Carlos
Eliminar mensajes seleccionados

Segundo intento

select p.* from PRODUCTOS WHERE [Link]=(


select [Link] from productos p where max(SUMA)=(
select max(suma)as cantidad_maxima from(
SELECT [Link],[Link] AS CODIGO, SUM([Link]) as suma
FROM productos p JOIN LINEAS l ON [Link]=[Link] GROUP BY
[Link],[Link])));

sigue sin funcionar , esperando respuesta del profesor

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

select [Link],sum([Link]) as total from clientes c join pedidos p on [Link]=[Link] where


[Link] LIKE ('%16') group by [Link];

SELECT [Link] AS CODIGO,

SUM([Link])

FROM clientes c
JOIN pedidos pe ON [Link] = [Link]

WHERE [Link] BETWEEN to_date('01-01-2016', 'dd-mm-yyyy') AND

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

GROUP BY CODIGO,

[Link]

ORDER BY CODIGO;

AMBAS FUNCIONAN ES MAS CORRECTA LA SEGUNDA YA QUE ESTOY COMPARANDO ARRIBA


LA FECHA CON UNA CADENA

SELECT * FROM(

SELECT [Link],SUM([Link]) AS SUMA from pedidos p where [Link] BETWEEN


TO_DATE('01/01/2016','dd/mm/yy') AND TO_DATE('31/12/2016','dd/mm/yy')

GROUP BY [Link] ORDER BY SUMA ASC)

WHERE ROWNUM<=3

ESTA TAMBIEN FUNCIONA

SELECT *

FROM

(SELECT [Link] AS CODIGO,

SUM([Link]) AS SUMA

FROM clientes c

JOIN pedidos pe ON [Link] = [Link]

WHERE [Link] BETWEEN to_date('01-01-2016', 'dd-mm-yyyy')

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

GROUP BY CODIGO,

[Link]

ORDER BY SUMA ASC)

WHERE ROWNUM <=3;

Para cada cliente mostrar su código y la suma total de sus pedidos y

gastos de envÍo
SELECT [Link],COUNT([Link]),(SUM(NVL(PE.GASTOS_ENVIO,0))) FROM PEDIDOS PE
GROUP BY [Link];

LOS GASTOS DE ENVIO LOS HE PUESTO A 0 CON NVL

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 [Link],[Link],[Link],NVL(PE.GASTOS_ENVIO,0) AS GASTOS FROM PEDIDOS


PE WHERE PE.GASTOS_ENVIO IS NULL;

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

select pe.* from pedidos pe where [Link]=(

SELECT MAX([Link]) from pedidos pe);

Mas caro

Mas barato

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

select pe.* from pedidos pe where [Link]=(

select min([Link]) from pedidos pe);

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

select [Link],sum([Link]) from clientes c join pedidos p on [Link]=[Link] where [Link]


LIKE('%16') group by [Link];

POR FIN SOLUCIONO EL PUNTO 16

select p.* from PRODUCTOS p WHERE [Link]=(

select [Link] from productos p JOIN lineas l on [Link]=[Link] group by [Link]


having sum([Link])= (

select max(suma)as cantidad_maxima from(

SELECT [Link], SUM([Link]) as suma

FROM productos p JOIN LINEAS l ON [Link]=[Link] GROUP BY [Link])));

LO QUE NECESITABA ERA HACER UN JOIN ¡!!

HE DE HACER CASO A LAS INDICACIONES ANTERIORES QUE ME DIO EL PROFESORE

DIVIDE Y VENCERÁS, IR OBTENIENDO RESULTADOS POCO A POCO HASTA OBTENER LO QUE YO


NECESITO.!

AHORA AL 17

Datos del producto más caro del pedido 1


select p.* from productos p where [Link]=(

select max(precio) from (

select [Link],[Link] as precio from productos p join lineas l on [Link]=[Link] where


l.num_pedido=1));

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

select c.* from

clientes c,

pedidos pe,

lineas l,

productos p

where [Link]=[Link]

and

[Link]=[Link]

and [Link]='PANTALÓN';

TAREA 5 CORRECION

En el punto 5 y 6 el precio se extrae automáticamente realizando una consulta en el


producto correspondiente. En el apartado 10, cuando se trabaja con null debes
utilizar (IS)-> gastos_envio is null. Debes cumplir las normas de entrega. En la tarea
se indica que cada sentencia debe ir acompañada con una captura del estado final
de la tabla después de ejecutar dicha sentencia.

COSAS IMPORTANTES

Cuando use la excepción other puedo saber el código usando:

Sqlerrm o sqlcode imprimiéndolo por pantalla

CURSORES IMPLICITOS EN PLSQL

SQL%FOUND

SQL%NOTFOUND

SQL%ROWCOUNT
Manda un error y no pasa por el notfound por eso hay que usar cursores explicitos
5 pos con subconsultas

Sacar ultimo pedido

select [Link] from pedidos p where fecha =(select max(fecha) from pedidos);

sacar ultimo importe

select [Link] from pedidos p where fecha =(select max(fecha) from pedidos);

insert into lineas (num,num_pedido,producto,cantidad,importe) values(1,1001,3);

insert into lineas (num,num_pedido,producto,cantidad,importe) values(5,(SELECT

[Link]

FROM

pedidos p

WHERE

fecha = (

SELECT

MAX(fecha)

FROM

pedidos))

,10001,3,(select [Link] from pedidos p where fecha =(select max(fecha) from


pedidos)));

Cuando se produce una excepción el bloque que la generó finaliza, no pudiendo volver
a él, pero si tienes en cuenta que el ámbito de las excepciones es similar al ámbito de las
variables, lo cual quiere decir que al crear bloques anidados los objetos creados en ese
bloque son locales a ese bloque (aunque pueden leer las del padre), podemos crear la
excepción en un sub-bloque, de tal forma que finalizaría ese sub-bloque pero
continuaría con la siguiente instrucción.

También podría gustarte