/*
Created 07/10/2016
Modified 07/10/2016
Project
Model
Company
Author
Version
Database PostgreSQL 8.1
*/


/* Create Tables */


Create table cliente
(
cod_cliente Integer NOT NULL,
nome Varchar(50),
data_nascimento Date,
primary key (cod_cliente)
) Without Oids;


Create table produto
(
cod_produto Integer NOT NULL,
nome_produto Varchar(50),
preco Money,
primary key (cod_produto)
) Without Oids;


Create table pedido
(
cod_pedido Integer NOT NULL,
data_pedido Date,
cod_cliente Integer NOT NULL,
primary key (cod_pedido)
) Without Oids;


Create table pedido_produto
(
cod_pedido Integer NOT NULL,
cod_produto Integer NOT NULL,
quantidade Integer,
primary key (cod_pedido,cod_produto)
) Without Oids;



/* Create Foreign Keys */

Alter table pedido add foreign key (cod_cliente) references cliente (cod_cliente) on update restrict on delete restrict;

Alter table pedido_produto add foreign key (cod_produto) references produto (cod_produto) on update restrict on delete restrict;

Alter table pedido_produto add foreign key (cod_pedido) references pedido (cod_pedido) on update restrict on delete restrict;


-------------------

insert into cliente (cod_cliente, nome, data_nascimento)
values (1,'grinaldo','1971/10/28'), (2,'joao','1981/01/01'), (3,'alberto','1965/04/04');


insert into produto (cod_produto, nome_produto, preco)
values (1,'coca-cola',10.0), (2, 'pepsi', 15.0), (3, 'fanta',12.5);

insert into produto (cod_produto, nome_produto, preco)
values (4,'sukita',10.0);


insert into pedido (cod_pedido, cod_cliente, data_pedido)
values (1,1,'2016/10/01'), (2,2,'2016/04/04'), (3,3,'2016/01/01');

insert into pedido_produto (cod_pedido, cod_produto, quantidade)
values (1,1,2), (1,3,2), (2,2,4), (3,1,4), (3,2,1);


---------------------
select c.nome, sum (pp.quantidade * pr.preco) as total
from cliente as c inner join pedido as p
on (c.cod_cliente = p.cod_cliente)
inner join pedido_produto as pp
on (p.cod_pedido = pp.cod_pedido)
inner join produto pr
on (pp.cod_produto = pr.cod_produto)
group by c.nome
order by total desc

select *
from produto as p
where p.cod_produto not in (select cod_produto from pedido_produto)


select c.nome, sum (pp.quantidade * pr.preco) as total
from cliente as c inner join pedido as p
on (c.cod_cliente = p.cod_cliente)
inner join pedido_produto as pp
on (p.cod_pedido = pp.cod_pedido)
inner join produto pr
on (pp.cod_produto = pr.cod_produto)
group by c.nome
having sum (cast ((pp.quantidade * pr.preco)as numeric)) > (
select avg (cast ((pp.quantidade * pr.preco) as numeric) ) as total
from pedido as p inner join pedido_produto as pp
on (p.cod_pedido = pp.cod_pedido)
inner join produto pr
on (pp.cod_produto = pr.cod_produto))




delete
from cliente
where nome in (
select c.nome
from cliente as c inner join pedido as p
on (c.cod_cliente = p.cod_cliente)
inner join pedido_produto as pp
on (p.cod_pedido = pp.cod_pedido)
inner join produto pr
on (pp.cod_produto = pr.cod_produto)
where extract(year from age(c.data_nascimento)) > 40
group by c.nome
having cast (sum (pp.quantidade * pr.preco) as numeric) > 50.0
)