Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Solucion Recuperacion SQL 1011

Descargar como odt, pdf o txt
Descargar como odt, pdf o txt
Está en la página 1de 9

// Ejercicio 1.

CREATE TABLE productos


(
codigo
VARCHAR2(4) CONSTRAINT pk_productos PRIMARY KEY,
nombre
VARCHAR2(30),
familia
VARCHAR2(20),
unidadesstock NUMBER(4),
CONSTRAINT codprod_ok CHECK ((substr(codigo,1,1) BETWEEN 'A' AND 'Z') AND (substr(codigo,2,3) BETWEEN '000' AND '999'))
);
CREATE TABLE proveedores
(
codigo
VARCHAR2(4) CONSTRAINT pk_proveedores PRIMARY KEY,
nombre
VARCHAR2(30) CONSTRAINT nombre_unico UNIQUE,
localidad
VARCHAR2(30),
CONSTRAINT codprov_ok CHECK (codigo LIKE 'P%')
);
CREATE TABLE clientes
(
codigo
VARCHAR2(4) CONSTRAINT pk_clientes PRIMARY KEY,
nombre
VARCHAR2(20) CONSTRAINT nombre_ok CHECK(nombre=initcap(nombre)),
provincia
VARCHAR2(20),
codigopostal VARCHAR2(5) CONSTRAINT cp_ok CHECK(substr(codigopostal,1,2) BETWEEN '01' AND '52'),
clase
VARCHAR2(1) CONSTRAINT clase_ok CHECK(clase IN ('A','B','C'))
);
CREATE TABLE compras
(
codigo
VARCHAR2(4) CONSTRAINT pk_compras PRIMARY KEY,
codproducto
VARCHAR2(4) CONSTRAINT fk_prod1 REFERENCES productos,
codproveedor
VARCHAR2(4) CONSTRAINT fk_prov REFERENCES proveedores,
preciounitario
NUMBER(5,2),
numunidades
NUMBER(3),
fechahora
DATE CONSTRAINT fecha_ok CHECK (to_char(fechahora,'mmdd') NOT BETWEEN '0621' AND '0921')
);
CREATE TABLE ventas
(
codigo
VARCHAR2(4) CONSTRAINT pk_ventas PRIMARY KEY,
codproducto
VARCHAR2(4) CONSTRAINT fk_prod2 REFERENCES productos,
codcliente
VARCHAR2(4) CONSTRAINT fk_clientes REFERENCES clientes,
precioventa
NUMBER(5,2),
numunidades
NUMBER(3) CONSTRAINT numunidadespositivo CHECK(numunidades>0),
fechahora
DATE CONSTRAINT hora_ok CHECK((to_char(fechahora,'hh24:mi') BETWEEN '09:00' AND '14:00') OR
(to_char(fechahora,'hh24:mi') BETWEEN '17:00' AND '20:00'))
);

//
// Ejercicio 2.
// Muestra los nombres de los productos que se han vendido en la primavera, verano y otoo del ao 2010
// (al menos una vez en cada una de esas estaciones).
SELECT nombre
FROM productos
WHERE codigo IN (

( SELECT codproducto
FROM ventas
WHERE fechahora BETWEEN to_date('21/03/2010','DD/MM/YYYY') AND to_date('20/06/2010','DD/MM/YYYY'))
INTERSECT
( SELECT codproducto
FROM ventas
WHERE fechahora BETWEEN to_date('21/06/2010','DD/MM/YYYY') AND to_date('20/09/2010','DD/MM/YYYY'))
INTERSECT
( SELECT codproducto
FROM ventas
WHERE fechahora BETWEEN to_date('21/09/2010','DD/MM/YYYY') AND to_date('20/12/2010','DD/MM/YYYY'))
);

NOMBRE
-----------------------------Tetera
// Ejercicio 3
// Muestra el nombre del producto de la familia 'Hogar' que nos ha hecho ganar ms dinero.
SELECT p.nombre, nvl(sum(v.numunidades*v.precioventa)-sum(c.numunidades*c.preciounitario),0) AS beneficio
FROM productos p, compras c, ventas v
WHERE p.codigo = c.codproducto(+)
AND p.codigo = v.codproducto(+)
AND familia = 'Hogar'
GROUP BY p.codigo, p.nombre
HAVING nvl(sum(v.numunidades*v.precioventa),0)-nvl(sum(c.numunidades*c.preciounitario),0)=
(SELECT max(nvl(sum(v.numunidades*v.precioventa),0)-nvl(sum(c.numunidades*c.preciounitario),0))
FROM productos p, compras c, ventas v
WHERE p.codigo = c.codproducto(+)
AND p.codigo = v.codproducto(+)
AND familia = 'Hogar'
GROUP BY p.codigo, p.nombre);
NOMBRE
BENEFICIO
------------------------------ ---------Taza
0

//
// Ejercicio 4
// Borra los productos con menos unidades vendidas de cada familia.
//
DELETE productos
WHERE codigo IN (

SELECT p.codigo
FROM productos p, ventas v
WHERE p.codigo = v.codproducto(+)
GROUP BY p.codigo, p.familia
HAVING sum(nvl(numunidades, 0))=(SELECT min(sum(nvl(numunidades, 0)))
FROM productos p2, ventas v2
WHERE p2.codigo = v2.codproducto(+)
AND p.familia = p2.familia
GROUP BY p2.codigo, p2.familia) );

CODI SUM(NVL(NUMUNIDADES,0))
---- ----------------------H006
0
E006
0

//
// Ejercicio 5
// Actualiza la columna UnidadesStock de la tabla productos aadiendo las unidades adquiridas de cada producto durante
// este mes de Enero de 2011.
UPDATE productos p
SET unidadesstock = unidadesstock + ( SELECT sum(numunidades)
FROM ventas
WHERE to_char(fechahora,'MM/YYYY')='01/2011'
AND codproducto = p.codigo )
WHERE codigo in ( SELECT codproducto
FROM ventas
WHERE to_char(fechahora,'MM/YYYY') = '01/2011' );
SQL> SELECT codigo, unidadesstock FROM productos;
CODI UNIDADESSTOCK
---- ------------H001
15
H002
75
H003
200
H004
150
H005
20
H006
75
E001
5
E002
5
E003
7
E004
9
E005
4
E006
3

//
// Ejercicio 6
// Crea una vista con el cliente que ms dinero se ha gastado de cada provincia, la fecha de su ltima compra y el nombre
// del producto que adquiri en dicha compra.
//
CREATE OR REPLACE VIEW ultimacompraclientesvip
AS
SELECT cl.nombre as nombrecliente, v.fechahora, p.nombre AS nombreproducto
FROM clientes cl, ventas v, productos p
WHERE cl.codigo = v.codcliente
AND p.codigo = v.codproducto
AND v.fechahora =( SELECT max(fechahora)
FROM ventas v2
WHERE v2.codcliente = cl.codigo)
AND cl.codigo IN ( SELECT cl2.codigo
FROM ventas v3, clientes cl2
WHERE v3.codcliente = cl2.codigo
GROUP BY cl2.codigo, cl2.provincia
HAVING sum(numunidades*precioventa)=( SELECT max(sum(numunidades*precioventa))
FROM ventas v4, clientes cl3
WHERE cl3.provincia = cl2.provincia
AND v4.codcliente = cl3.codigo
GROUP BY cl3.codigo, cl3.provincia));
NOMBRECLIENTE
-------------------Marina Moreda
Marina Moreda
Marina Moreda
Moises Garcia
Alberto Mariscal

FECHAHOR
-------23/01/09
23/01/09
23/01/09
23/01/11
23/01/11

NOMBREPRODUCTO
-----------------------------iPod
Kindle
iPad
iPhone
Kindle

// Ejercicio 7
// Muestra los nombres de los productos de los que se han vendido menos unidades en 2010 que en 2009.
CREATE OR REPLACE VIEW ventas2009 AS
SELECT nombre, nvl(sum(numunidades),0) AS total2009
FROM productos p, ventas v
WHERE p.codigo = v.codproducto(+)
AND to_char(fechahora,'YYYY') = '2009'
GROUP BY nombre, p.codigo
UNION
SELECT nombre, 0 AS total2009
FROM productos
WHERE codigo NOT IN ( SELECT codproducto
FROM ventas
WHERE to_char(fechahora,'YYYY')='2009');
CREATE OR REPLACE VIEW ventas2010
AS
SELECT nombre, nvl(sum(numunidades),0) AS total2010
FROM productos p, ventas v
WHERE p.codigo=v.codproducto(+)
AND to_char(fechahora,'YYYY')='2010'
GROUP BY nombre, p.codigo
UNION
SELECT nombre, 0 AS total2010
FROM productos
WHERE codigo NOT IN ( SELECT codproducto
FROM ventas
WHERE to_char(fechahora,'YYYY')='2010');
SELECT v1.nombre
FROM ventas2009 v1, ventas2010 v2
WHERE v1.nombre=v2.nombre
AND total2010<total2009;
NOMBRE
-----------------------------Cucharon
Kindle
LG LE5500
Plato Hondo
Plato Llano
iPad
iPhone
iPod

//
// Ejercicio 8
// Muestra los nombres de los clientes que han comprado por la tarde algn artculo que haya suministrado alguna vez un
// proveedor madrileo.
//
SELECT nombre
FROM clientes
WHERE codigo IN (

SELECT codcliente
FROM ventas
WHERE to_char(fechahora,'hh24') BETWEEN '17' AND '20'
AND codproducto in ( SELECT codproducto
FROM compras
WHERE codproveedor in ( SELECT codigo
FROM proveedores
WHERE localidad = 'Madrid')));

NOMBRE
-------------------Jesus Alba
Gonzalo Carmona
Moises Garcia
Marina Moreda

//
// Ejercicio 9
// Muestra el importe total de las ventas de productos de la familia 'Hogar' por provincia y codigo postal.
//
SELECT cl.provincia, cl.codigopostal, sum(numunidades*precioventa) as importe_hogar
FROM clientes cl, ventas v
WHERE cl.codigo = v.codcliente
AND v.codproducto in ( SELECT codigo
FROM productos
WHERE familia = 'Hogar' )
GROUP BY cl.provincia, cl.codigopostal;
PROVINCIA
-------------------Sevilla
Sevilla
Cadiz
Sevilla

CODIG IMPORTE_HOGAR
----- ------------41701
100,75
41702
7,35
11701
295,36
41010
110,5

//
// Ejercicio 10
// Muestra una lista con todos los productos y el nmero total de unidades vendidas, incluyendo aquellos productos de los
// que no se ha vendido ninguna unidad.
//
SELECT nombre, nvl(sum(numunidades),0)
FROM productos p, ventas v
WHERE p.codigo = v.codproducto(+)
GROUP BY nombre;
NOMBRE
NVL(SUM(NUMUNIDADES),0)
------------------------------ ----------------------Taza
0
Kindle
3
Plato Hondo
78
Plato Llano
55
Azucarero
6
iPod
10
Cucharon
55
Tetera
15
iPhone
4
iPad
4
LG LE5500
3
Samsung CE6530
0

//
// Ejercicio 11
// Se acaba de realizar una venta de una unidad del producto del que ms unidades hay en stock de la familia
// 'Electronica' al cliente que ms dinero se ha gastado de la provincia de Cdiz. Inserta el registro correspondiente.
//
insert into ventas (codigo, codproducto, codcliente, precioventa, numunidades, fechahora)
values ( ( SELECT ltrim(to_char(max(codigo)+1,'0999'))
FROM ventas ),
( SELECT codigo
FROM productos
WHERE familia='Electrnica'
AND unidadesstock = (SELECT max(unidadesstock)
FROM productos
WHERE familia='Electrnica') ),
( SELECT c.codigo
FROM clientes c, ventas v
WHERE c.codigo = v.codcliente
AND provincia = 'Cadiz'
GROUP BY c.codigo
HAVING sum(numunidades*precioventa) = ( SELECT max(sum(numunidades*precioventa))
FROM clientes c, ventas v
WHERE c.codigo = v.codcliente
AND provincia = 'Cadiz'
GROUP BY v.codcliente
) ),
535,
1,
sysdate);
CODI CODP CODC PRECIOVENTA NUMUNIDADES FECHAHOR
---- ---- ---- ----------- ----------- -------0026 E004 C002
535
1

También podría gustarte