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.