Você está na página 1de 10

Soluções Exercícios SQL

Parte 1:

1)
drop table venda;
drop table nota_produto;
drop table produto;
drop table nota;
drop table cliente;

CREATE TABLE cliente (


cod_cliente integer PRIMARY KEY,
nome varchar(50),
cidade varchar(50),
uf varchar(2),
endereco varchar(50),
data_nasc date
);

CREATE TABLE nota (


num_nota integer PRIMARY KEY,
data timestamp,
num_parcela integer,
cod_cliente integer NOT NULL,
FOREIGN KEY(cod_cliente) REFERENCES cliente (cod_cliente)
);

CREATE TABLE produto (


cod_produto integer PRIMARY KEY,
qtde_estoque integer,
descricao varchar(50),
valor numeric
);

CREATE TABLE venda (


num_nota integer,
data_vencto date,
data_pagto date,
multa_juro numeric,
valor numeric,
desconto numeric,
PRIMARY KEY(num_nota,data_vencto),
FOREIGN KEY(num_nota) REFERENCES nota (num_nota)
);
CREATE TABLE nota_produto (
num_nota integer,
cod_produto integer,
valor numeric,
qtde integer,
PRIMARY KEY(num_nota,cod_produto),
FOREIGN KEY(num_nota) REFERENCES nota (num_nota),
FOREIGN KEY(cod_produto) REFERENCES produto (cod_produto)
);

2)

insert into cliente values (1, 'Cliente 1', 'Araranguá', 'SC', 'Endereco 1', '1976-10-5');
insert into cliente values (2, 'Cliente 2', 'Arroio do Silva', 'SC', 'Endereco 2', '1980-09-11');
insert into cliente values (3, 'Cliente 3', 'Araranguá', 'SC', 'Endereco 3', '1952-01-29');
insert into cliente values (4, 'Cliente 4', 'Turvo', 'SC', 'Endereco 4', '1980-03-21');

insert into produto values (1, 10, 'Produto 1', 12.00);


insert into produto values (2, 21, 'Produto 2', 33.00);

insert into nota values (1, '2015-09-02', 0, 1);


insert into nota_produto values (1, 1, 12.00, 3);
insert into nota_produto values (1, 2, 33.00, 8);
insert into venda values (1, '2015-09-02', '2015-10-02', null, 300, null);

insert into nota values (2, '2015-10-02', 2, 1);


insert into nota_produto values (2, 1, 12.00, 3);
insert into venda values (2, '2015-11-02', null, null, 18, null);
insert into venda values (2, '2015-12-03', null, null, 18, null);

insert into nota values (3, '2015-10-02', 2, 2);


insert into nota_produto values (3, 1, 12.00, 1);
insert into nota_produto values (3, 2, 33.00, 1);
insert into venda values (3, '2015-11-02', null, null, 25, null);
insert into venda values (3, '2015-12-03', null, null, 20, null);

commit;

update venda
set desconto = 1.00,
data_pagto = '2015-10-28'
where num_nota = 2 and data_vencto = '2015-11-02';

update venda
set multa_juro = 1.20,
data_pagto = '2015-11-15'
where num_nota = 3 and data_vencto = '2015-11-02';
3)

-- Selecione o total de vendas por cliente e por mês/ano;

select cli.cod_cliente, cli.nome, extract(month from data) as mes, extract(year from data) as ano,
sum(vda.valor)
from cliente as cli, nota as nt, venda as vda
where cli.cod_cliente = nt.cod_cliente and
nt.num_nota = vda.num_nota
group by cli.cod_cliente, nome, mes, ano
order by nome, ano, mes;

-- Selecione o total de vendas por estado;

select cli.uf, sum(vda.valor)


from cliente as cli, nota as nt, venda as vda
where cli.cod_cliente = nt.cod_cliente and
nt.num_nota = vda.num_nota
group by cli.uf
order by cli.uf;

-- Selecione o produto mais vendido em um período determinado de tempo;

-- 1a solução

select prod.cod_produto, sum_qtde.qtde from produto as prod,


(select np.cod_produto, sum(np.qtde) as qtde
from nota_produto as np, nota as nt
where nt.num_nota = np.num_nota and
nt.data between '2015-06-01' and '2015-12-31'
group by np.cod_produto) as sum_qtde,
(select max(sqtde) as qtde
from (select np.cod_produto, sum(np.qtde) as sqtde
from nota_produto as np, nota as nt
where nt.num_nota = np.num_nota and
nt.data between '2015-06-01' and '2015-12-31'
group by np.cod_produto) as sum_qtde) as max_qtde
where prod.cod_produto = sum_qtde.cod_produto and
sum_qtde.qtde = max_qtde.qtde;

-- 2a solução

select cod_produto, sqtde from (


select np.cod_produto, max_qtde.mqtde, sum(np.qtde) as sqtde
from nota_produto as np, nota as nt,
(select max(sqtde) as mqtde
from (select np.cod_produto, sum(np.qtde) as sqtde
from nota_produto as np, nota as nt
where nt.num_nota = np.num_nota and
nt.data between '2015-06-01' and '2015-12-31'
group by np.cod_produto) as sum_qtde) as max_qtde
where nt.num_nota = np.num_nota and
nt.data between '2015-06-01' and '2015-12-31'
group by np.cod_produto, max_qtde.mqtde) as geral
where mqtde = sqtde;

-- Selecione o total recebido por cliente um determinado período de tempo;

select cli.cod_cliente, cli.nome,


sum(vda.valor+coalesce(multa_juro,0)-coalesce(desconto,0)) as valor
from cliente as cli, nota as nt, venda as vda
where cli.cod_cliente = nt.cod_cliente and
nt.num_nota = vda.num_nota and
vda.data_pagto between '2015-06-01' and '2015-12-31'
group by cli.cod_cliente, nome
order by nome;

-- Selecione o total a receber por cliente em um determinado período de tempo;

select cli.cod_cliente, cli.nome, sum(vda.valor) as valor


from cliente as cli, nota as nt, venda as vda
where cli.cod_cliente = nt.cod_cliente and
nt.num_nota = vda.num_nota and
vda.data_vencto between '2015-06-01' and '2015-12-31' and
vda.data_pagto is null
group by cli.cod_cliente, nome
order by nome;
Parte 2

1)

select produto.* from produto,


(select max(qtde_total) as qtde_total
from (select np.cod_produto, sum(np.qtde) as qtde_total
from nota_produto np, nota nt
where np.num_nota = nt.num_nota and
nt.data between '2010-10-01' and '2010-12-31'
group by np.cod_produto
) as prod_sum_in) as prod_max,
(select np.cod_produto, sum(np.qtde) as qtde_total
from nota_produto np, nota nt
where np.num_nota = nt.num_nota and
nt.data between '2010-10-01' and '2010-12-31'
group by np.cod_produto
) as prod_sum
where produto.cod_produto = prod_sum.cod_produto and
prod_sum.qtde_total = prod_max.qtde_total

create view vw_nt_produto_nota as


select np.cod_produto, nt.data, np.qtde
from nota_produto np, nota nt
where np.num_nota = nt.num_nota;

select produto.* from produto,


(select max(qtde_total) as qtde_total
from (select cod_produto, sum(qtde) as qtde_total
from vw_nt_produto_nota
where data between '2010-10-01' and '2010-12-31'
group by cod_produto
)) as prod_max,
(select cod_produto, sum(qtde) as qtde_total
from vw_nt_produto_nota
where data between '2010-10-01' and '2010-12-31'
group by cod_produto
) as prod_sum
where produto.cod_produto = prod_sum.cod_produto and
prod_sum.qtde_total = prod_max.qtde_total

2)

a)
select livro.titulo, emprestimo.data_emprestimo, emprestimo.data_devolução from livro, exemplar,
emprestimo
where livro.isbn = exemplar.isbn and
exemplar.cod_exemplar = emprestimo.cod_exemplar and
emprestimo.cod_associado = 1 and
emprestimo.data_emprestimo between '2017-03-01' and '2017-04-30'
order by emprestimo.data_emprestimo desc;

b)
select * from livro
where titilo like ‘%Banco de Dados’;

3)

CREATE TABLE Fornecedor (


cod_fornecedor integer PRIMARY KEY,
nome varchar(50)
)

CREATE TABLE Fornecedor_Produto (


cod_fornecedor integer,
cod_produto integer,
valor double,
PRIMARY KEY(cod_fornecedor,cod_produto),
FOREIGN KEY(cod_fornecedor) REFERENCES Fornecedor (cod_fornecedor)
)

CREATE TABLE Produto (


cod_produto integer PRIMARY KEY,
descricao varchar(50)
)

ALTER TABLE Fornecedor_Produto ADD FOREIGN KEY(cod_produto) REFERENCES Produto (cod_produto)

insert into produto (cod_produto, descricao) values (1, ‘produto 1');


insert into produto (cod_produto, descricao) values (2, ‘produto 2');

insert into fornecedor (cod_fornecedor, nome) values (1, 'fornecedor 1');


insert into fornecedor (cod_fornecedor, nome) values (2, 'fornecedor 2');

insert into fornecedor_produto (cod_fornecedor, cod_produto, valor) values (1, 1, 100.00);


insert into fornecedor_produto (cod_fornecedor, cod_produto, valor) values (1, 2, 130.00);
insert into fornecedor_produto (cod_fornecedor, cod_produto, valor) values (2, 1, 90.00);
insert into fornecedor_produto (cod_fornecedor, cod_produto, valor) values (2, 2, 110.20);
commit;

select nome, avg(valor) as valor_medio


from fornecedor as f inner join fornecedor_produto as fpr
on f.cod_fornecedor = fpr.cod_fornecedor
group by nome
having avg(valor) > 100

Ou

select * from (
select nome, avg(valor) as valor_medio
from fornecedor as f inner join fornecedor_produto as fpr
on f.cod_fornecedor = fpr.cod_fornecedor
group by nome) as res
where valor_medio > 100

4)

a)

select g.nome, count(*) qtde, sum(p.quantidade * p.valor) total_venda,


(sum(p.quantidade * p.valor) * 0.15) salario
from pedido as p
inner join garcom as g on p.cod_garcom = g.cod_garcom
inner join nota as n on p.cod_nota = n.cod_nota and
n.data between '2017-05-01' and '2017-05-31'
group by g.nome;

b)

select b.nome, sum(p.quantidade * p.valor) -


(sum(p.quantidade * p.valor) * 0.15) as faturamento
from pedido as p
inner join nota as n on p.cod_nota = n.cod_nota
inner join mesa as m on n.cod_mesa = m.cod_mesa
inner join bar as b on m.cod_bar = b.cod_bar
group by b.nome
order by faturamento desc;

ou

select b.nome, sum(p.quantidade * p.valor) * 0.85 as faturamento


from pedido as p
inner join nota as n on p.cod_nota = n.cod_nota
inner join mesa as m on n.cod_mesa = m.cod_mesa
inner join bar as b on m.cod_bar = b.cod_bar
group by b.nome
order by faturamento desc

5)

1)
select c.codigo, nome, descricao
from colaborador as c
inner join perfil as p on c.cod_perfil = p.codigo;

2)
select col.*
from colaborador as col
inner join perfil as p on col.cod_perfil = p.codigo
and p.descricao = 'Desenvolvedor';

3)
select distinct col.codigo, col.nome
from projeto as pr
inner join atividade as at on pr.codigo = at.cod_projeto
inner join atividade_colaborador as ac on ac.cod_atividade = at.codigo
inner join colaborador as col on col.codigo = ac.cod_colaborador
where pr.codigo = 1;

4)
select p.codigo, p.descricao, count(*)
from projeto as p
inner join
(select distinct pr.codigo as cod_projeto, col.codigo, col.nome
from projeto as pr
inner join atividade as at on pr.codigo = at.cod_projeto
inner join atividade_colaborador as ac on ac.cod_atividade = at.codigo
inner join colaborador as col on col.codigo = ac.cod_colaborador) as a
on p.codigo = a.cod_projeto
group by p.codigo, p.descricao

ou

select p.codigo, p.descricao, count(*)


from projeto as p
inner join
(select distinct at.cod_projeto, ac.cod_colaborador
from atividade as at
inner join atividade_colaborador as ac on ac.cod_atividade = at.codigo) as a
on p.codigo = a.cod_projeto
group by p.codigo, p.descricao

5)
select p.codigo, p.descricao, sum(at.qtde_hora_prevista), sum(at.qtde_hora_total)
from atividade as at
inner join projeto as p on at.cod_projeto = p.codigo
group by p.codigo, p.descricao
having sum(qtde_hora_total) > sum(qtde_hora_prevista);
6)
select pr.codigo, pr.descricao,
sum(at.qtde_hora_prevista * ac.perc_colaboracao * per.custo_hora) as custo_previsto,
sum(at.qtde_hora_total * ac.perc_colaboracao * per.custo_hora) as custo_real
from atividade as at
inner join atividade_colaborador as ac on ac.cod_atividade = at.codigo
inner join colaborador as col on col.codigo = ac.cod_colaborador
inner join perfil as per on per.codigo = col.cod_perfil
inner join projeto as pr on pr.codigo = at.cod_projeto
group by pr.codigo, pr.descricao
having sum(at.qtde_hora_total * ac.perc_colaboracao * per.custo_hora) >
(sum(at.qtde_hora_prevista * ac.perc_colaboracao * per.custo_hora) * 1.15);

ou

select * from (
select pr.codigo, pr.descricao,
sum(at.qtde_hora_prevista * ac.perc_colaboracao * per.custo_hora) as custo_previsto,
sum(at.qtde_hora_total * ac.perc_colaboracao * per.custo_hora) as custo_real
from atividade as at
inner join atividade_colaborador as ac on ac.cod_atividade = at.codigo
inner join colaborador as col on col.codigo = ac.cod_colaborador
inner join perfil as per on per.codigo = col.cod_perfil
inner join projeto as pr on pr.codigo = at.cod_projeto
group by pr.codigo, pr.descricao) as res_final
where custo_real > (custo_previsto * 1.15);

7)
select cat.codigo, cat.descricao,
avg(qtde_hora_prevista) as mediaHoraPrevista,
avg(qtde_hora_total) as mediaHoraTotal
from atividade as at
inner join categoria as cat on cat.codigo = at.cod_categoria
group by cat.codigo, cat.descricao;

8)

select cat.codigo, cat.descricao, sum(at.qtde_hora_total) as total


from atividade as at
inner join categoria as cat on cat.codigo = at.cod_categoria
group by cat.codigo, cat.descricao
having sum(at.qtde_hora_total) = (
select max(total) as max_hora
from (select at.cod_categoria,
sum(at.qtde_hora_total) as total
from atividade as at
group by at.cod_categoria) as sum_qht)
9)

select cat.codigo, cat.descricao, sum(at.qtde_hora_total) as total


from atividade as at
inner join categoria as cat on cat.codigo = at.cod_categoria
group by cat.codigo, cat.descricao
order by total desc
limit 5
------------------------ Alternativa para a solução do exercício 5-1-2.c (Lista SQL-A)

select pr.cod_produto, pr.descricao, pr.qtde_estoque, pr.valor, sum(np.qtde) as qtde_total


from nota_produto np, nota nt, produto pr
where np.num_nota = nt.num_nota and
nt.data between '2015-10-01' and '2015-12-31' and
np.cod_produto = pr.cod_produto
group by pr.cod_produto, pr.descricao, pr.qtde_estoque, pr.valor
having sum(np.qtde) = (select max(qtde_total) as qtde_total
from (select np.cod_produto, sum(np.qtde) as qtde_total
from nota_produto np, nota nt
where np.num_nota = nt.num_nota and
nt.data between '2015-10-01' and '2015-12-31'
group by np.cod_produto) as prod_sum)

Você também pode gostar