/*
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
)