Fundamentos
de
Banco
de
Dados
Lista
05
–
Revisão
SQL
GABARITO
Considere os seguintes esquemas de relação.
(
CV)
CLIENTES_VIPS
(
clcodigo
:
integer,
desconto
:real)
(
CL)
CLIENTES
(
clcodigo
:
integer,
nome
:string,
telefone
:string,
cidade
:
string,
dataNasc
:string);
(PE)
PEDIDOS
(
pecodigo
:
integer,
clcodigo
:integer,
dataEntrega
:string);
(IP)
ITENS_PEDIDOS
(
pecodigo
:integer
,
prcodigo
:integer,
quantidade
:
integer;
valor
:real);
(PR)
PRODUTOS
(
prcodigo
:integer,
descrição
:integer)
(FP)
FORNECE_PRODUTOS
(
prcodigo
:integer,
fcodigo
:string);
Escreva
as
seguintes
consultas
em
SQL.
1. Para
cada
produto,
obtenha
o
código
do
produto,
nome
do
produto
e
a
quantidade
de
clientes
vips
que
fizeram
pedido
do
produto
em
quantidade
maior
do
que
10.
Caso
o
produto
não
satisfaça
a
condição
para
nenhum
cliente
vip,
colocar
ZERO
na
coluna
correspondente
a
quantidade
de
clientes
vips.
Solução 01:
SELECTP.PRCODIGO,P.DESCRICAO,COUNT(DISTINCTCV.CLCODIGO) FROMCLIENTES_VIPSCV
INNERJOINPEDIDOSPEONCV.CLCODIGO=PE.CLCODIGO INNERJOINITENS_PEDIDOSIPONPE.PECODIGO=IP.PECODIGO
RIGHTJOINPRODUTOSPONIP.PRCODIGO= P.PRCODIGOANDIP.QUANTIDADE>10 GROUPBYP.PRCODIGO;
Solução 02:
SELECTP.PRCODIGO,P.DESCRICAO,COUNT(DISTINCTV.CLCODIGO) FROMPRODUTOSP
LEFTJOIN(
SELECTCV.CLCODIGO,IP.PECODIGO,IP.PRCODIGO FROMCLIENTES_VIPSCV
INNERJOINPEDIDOSPEONCV.CLCODIGO=PE.CLCODIGO INNERJOINITENS_PEDIDOSIPONPE.PECODIGO=IP.PECODIGO WHEREIP.QUANTIDADE>10)V ONP.PRCODIGO=V.PRCODIGO GROUPBYP.PRCODIGO;
Solução 03:
CREATEVIEWQ1(cvcodigo,pecodigo, prcodigo,quantidade)AS SELECT CV.clcodigo,PE.pecodigo,IP.prcodigo,IP.quantidade
FROM CLIENTES_VIPSCV,CLIENTESCL,PEDIDOSPE,ITENS_PEDIDOSIP WHERE CV.clcodigo=CL.clcodigo
AND CL.clcodigo=PE.clcodigo AND PE.pecodigo=IP.pecodigo
ORDERBY CV.clcodigo,PE.pecodigo,IP.prcodigo,IP.quantidade; SELECTPR.prcodigo,PR.descricao,COUNT(DISTINCTQ1.cvcodigo) FROM PRODUTOSPR
LEFTJOINQ1
ON PR.prcodigo=Q1.prcodigo AND Q1.quantidade>10
2. Obtenha
o
código
e
descrição
dos
produtos
fornecidos
pelo
fornecedor
F231
e
que
não
foram
comprados
por
nenhum
cliente
vip.
Solução01:
SELECTPR.prcodigo,PR.descricao
FROM PRODUTOSPR,FORNECE_PRODUTOS FP,FORNECEDORESF WHEREPR.prcodigo=FP.prcodigo
AND FP.fcodigo=F.fcodigo AND F.fnome='F231'
AND PR.prcodigoNOTIN(SELECTDISTINCTQ1.prcodigo FROMQ1);
--Obs:UtilizamosaViewQ1daquestãoanterior.
Solução02:
SELECTP.PRCODIGO,P.DESCRICAO FROMPRODUTOSP
INNERJOINFORNECE_PRODUTOSFPONFP.PRCODIGO=P.PRCODIGO INNERJOINFORNECEDORESFONFP.FCODIGO=F.FCODIGO
WHEREF.FNOME='F231'
ANDP.PRCODIGONOTIN( SELECTIP.PRCODIGO FROMCLIENTES_VIPSCV
INNERJOINPEDIDOSPEONCV.CLCODIGO=PE.CLCODIGO INNERJOINITENS_PEDIDOSIPONIP.PECODIGO=PE.PECODIGO);
Solução03:
SELECTPR.prcodigo,PR.descricao
FROMPRODUTOSPR,FORNECE_PRODUTOS FP,FORNECEDORESF WHEREPR.prcodigo=FP.prcodigo
ANDFP.fcodigo=F.fcodigo ANDF.fnome='F231' EXCEPT
SELECTPR.prcodigo,PR.descricao
FROMCLIENTES_VIPSCV,CLIENTESCL,PEDIDOS PE,ITENS_PEDIDOSIP,PRODUTOSPR WHERECV.clcodigo=CL.clcodigo
ANDCL.clcodigo=PE.clcodigo ANDPE.pecodigo=IP.pecodigo ANDIP.prcodigo=PR.prcodigo
3. Para
cada
PEDIDO,
obtenha
o
código
do
pédido,
nome
do
cliente
e
custo
dos
pedidos.
(obs
1:
O
custo
de
um
pedido
é
igual
ao
somatório
dos
valores
de
todos
os
itens
do
pedido)
Solução 01:
SELECTPE.pecodigo,CL.nome,SUM(IP.quantidade*IP.valor)ASCusto FROMPEDIDOSPE,CLIENTESCL,ITENS_PEDIDOSIP
WHEREPE.clcodigo=CL.clcodigo AND PE.pecodigo=IP.pecodigo GROUPBYPE.pecodigo,CL.nome ORDERBYPE.pecodigo;
Solução 02:
SELECTPE.PECODIGO,CL.NOME,SUM(IP.QUANTIDADE*IP.VALOR) FROMPEDIDOSPE
INNERJOINCLIENTESCLONCL.CLCODIGO=PE.CLCODIGO INNERJOINITENS_PEDIDOSIPONPE.PECODIGO=IP.PECODIGO GROUPBYPE.PECODIGO,CL.NOME;
Solução 03:
CREATEVIEWCusto_Pedido(pecodigo,total)AS SELECTPE.pecodigo,sum(IP.valor*IP.quantidade) FROMPEDIDOSPE,ITENS_PEDIDOSIP WHEREPE.pecodigo=IP.pecodigo GROUPBYPE.pecodigo;
SELECTP.pecodigo,C.nome,CP.total
FROMCusto_PedidoCP,CLIENTESC,PEDIDOSP WHEREC.clcodigo=P.clcodigoAND
P.pecodigo=CP.pecodigo
4. Obtenha
o
código
e
nome
dos
clientes
cuja
média
dos
custos
dos
seus
pedidos
é
maior
do
que
a
média
dos
pedidos.
Solução 01:
CREATEVIEWQ4(clcodigo,nome, pecodigo,custo)AS
SELECTCL.clcodigo,CL.nome,PE.pecodigo,SUM(IP.quantidade*IP.valor) FROMPEDIDOSPE,CLIENTESCL,ITENS_PEDIDOSIP
WHEREPE.clcodigo=CL.clcodigo AND PE.pecodigo=IP.pecodigo
GROUPBYCL.clcodigo,CL.nome,PE.pecodigo ORDERBYCL.clcodigo,PE.pecodigo;
--Obs1: Essa view contem todos os pedidos de cada cliente, com seus respectivos custos. SELECTQ4.clcodigo,Q4.nome
FROM Q4
GROUPBYQ4.clcodigo,Q4.nome
HAVINGAVG(Q4.custo)>(SELECTAVG(IP.valor*IP.quantidade)FROMITENS_PEDIDOSIP); ORDERBYQ4.clcodigo;
-- Obs2: Aqui retorna quais os clientes possuem a média dos custos de seus pedidos maiores que a média geral de todos os custos de pedidos existentes.
Solução 02:
CREATEVIEWCUSTO_POR_PEDIDO(PECODIGO,CLCODIGO,CUSTO)AS SELECTPE.PECODIGO,CL.CLCODIGO,SUM(IP.QUANTIDADE*IP.VALOR) FROMPEDIDOSPE
INNERJOINCLIENTESCLONCL.CLCODIGO=PE.CLCODIGO INNERJOINITENS_PEDIDOSIPONPE.PECODIGO=IP.PECODIGO GROUPBYPE.PECODIGO,CL.CLCODIGO;
SELECTCL.CLCODIGO,CL.NOME FROMCLIENTESCL
INNERJOINCUSTO_POR_PEDIDOVONCL.CLCODIGO=V.CLCODIGO GROUPBYCL.CLCODIGO
Solução03:
CREATEVIEWVPed(pecodigo,clcodigo,total)AS
SELECTPE.pecodigo,PE.clcodigo,SUM(IP.quantidade*IP.valor) FROMPEDIDOSPE,ITENS_PEDIDOSIP
WHEREPE.pecodigo=IP.pecodigo GROUPBYPE.pecodigo,PE.clcodigo;
SELECTDISTINCTCL.clcodigo,CL.nome
FROMCLIENTESCL,PEDIDOSPE, ITENS_PEDIDOSIP,VPedVP WHERECL.clcodigo=PE.pecodigoAND PE.pecodigo=IP.pecodigoAND (SELECTROUND(AVG(VP.total)::numeric,1)
FROMVPedVP
WHEREVP.clcodigo=CL.clcodigo
GROUPBYVP.clcodigo)>(SELECTROUND(AVG(VP.total)::numeric,1) FROMVPedVP);
5. Obtenha
o
código,
nome
e
cidade
do
cliente
que
fez
o
pedido
de
maior
custo.
Solução01:
SELECTQ4.clcodigo,Q4.nome,CL.cidade FROM Q4,CLIENTESCL
WHEREQ4.clcodigo=CL.clcodigo
AND Q4.custo>=ALL(SELECTQ4.custoFROMQ4);
Solução02:
SELECTCL.CLCODIGO,CL.NOME,CL.CIDADE,V.CUSTO FROMCLIENTESCL
INNERJOINCUSTO_POR_PEDIDOVONCL.CLCODIGO=V.CLCODIGO WHEREV.CUSTO=(SELECTMAX(CUSTO)FROMCUSTO_POR_PEDIDOV);
Solução03:
SELECTCL.CLCODIGO,CL.NOME,CL.CIDADE FROMCLIENTESCL
WHERECL.CLCODIGOIN( SELECTV.CLCODIGO
FROMCUSTO_POR_PEDIDOV
WHEREV.CUSTO=(SELECTMAX(CUSTO)FROMCUSTO_POR_PEDIDOV)) Solução04:
SELECTc.clcodigo,c.nome,c.cidade
FROM(SELECTp.clcodigo,p.pecodigo,SUM(ip.valor*ip.quantidade)AScusto FROMpedidosp
INNERJOINitens_pedidosiponip.pecodigo=p.pecodigo GROUPBYp.clcodigo,p.pecodigo
ORDERBYp.clcodigo,p.pecodigo)ASsub1
INNERJOINclientescONc.clcodigo=sub1.clcodigo GROUPBYc.clcodigo
ORDERBYMAX(sub1.custo) DESCLIMIT1;
6.
Para
cada
PRODUTO,
obtenha
PARA
CADA
CLIENTE,
a
quantidade
total
que
esse
cliente
comprou
desse
produto,
considerando
todos
os
pedidos
do
cliente.
Na
resposta
deve
constar
todos
os
produtos
e
todos
os
clientes.
Para
os
produtos
que
não
foram
comprados
pelo
cliente,
então
a
quantidade
total
deverá
ser
“zero”.
Solução 01:
CREATEVIEWQ6(clcodigo,pecodigo, prcodigo,quantidade)AS SELECTCL.clcodigo,PE.pecodigo,IP.prcodigo,IP.quantidade FROMCLIENTESCL,PEDIDOSPE,ITENS_PEDIDOSIP WHERECL.clcodigo=PE.clcodigo
AND PE.pecodigo=IP.pecodigo
ORDERBYCL.clcodigo,PE.pecodigo,IP.prcodigo,IP.quantidade;
SELECTV.prcodigo,V.descricao,V.clcodigo,SUM(Q6.quantidade) FROM Q6
RIGHTJOIN(SELECTP.prcodigo,P.descricao,CL.clcodigo FROMPRODUTOSP,CLIENTESCL)V ONQ6.prcodigo=V.prcodigo
ANDQ6.clcodigo=V.clcodigo
GROUPBYV.prcodigo,V.descricao,V.clcodigo ORDERBYV.prcodigo,V.descricao,V.clcodigo; Solução 02:
SELECTV.CLCODIGO,V.PRCODIGO,SUM(COALESCE(IP.QUANTIDADE,0)) FROMITENS_PEDIDOSIP
INNERJOINPEDIDOSPEONPE.PECODIGO=IP.PECODIGO RIGHTJOIN(
SELECTP.PRCODIGO,CL.CLCODIGO FROMPRODUTOSP,CLIENTESCL
)VONIP.PRCODIGO=V.PRCODIGOANDPE.CLCODIGO=V.CLCODIGO GROUPBYV.CLCODIGO,V.PRCODIGO
7. Obtenha
os
códigos
e
nomes
dos
clientes
que
que
compraram
todos
os
produtos
fornecidos
por
um
fornecedor
na
mesma
cidade
do
cliente.
Solução 01:
SELECTDISTINCTCL.CLCODIGO,CL.NOME FROMCLIENTESCL
INNERJOINFORNECEDORESFONCL.CIDADE=F.CIDADE WHERENOTEXISTS(
SELECT*
FROMFORNECE_PRODUTOSFP WHEREFP.FCODIGO=F.FCODIGO ANDFP.PRCODIGONOTIN(
SELECTIP.PRCODIGO FROMITENS_PEDIDOSIP
INNERJOINPEDIDOSPEONPE.PECODIGO=IP.PECODIGO WHEREPE.CLCODIGO=CL.CLCODIGO
) );
Solução 02:
CREATEVIEWQ7(fcodigo,fcidade,qtdprodutos)AS
SELECTF.fcodigo,F.cidade,COUNT(DISTINCTFP.prcodigo) FROMFORNECEDORESF,FORNECE_PRODUTOSFP WHEREF.fcodigo=FP.fcodigo
GROUPBYF.fcodigo;
CREATEVIEWQ7A(clcodigo,nome,cidade,fcodigo,qtdprodutos)AS
SELECTCL.clcodigo,CL.nome,CL.cidade,FP.fcodigo,COUNT(DISTINCTFP.prcodigo)
FROMCLIENTESCL,PEDIDOSPE,ITENS_PEDIDOSIP,PRODUTOSPR,FORNECE_PRODUTOSFP WHERECL.clcodigo=PE.clcodigo
ANDPE.pecodigo=IP.pecodigo ANDIP.prcodigo=PR.prcodigo ANDPR.prcodigo=FP.prcodigo GROUPBYCL.clcodigo,FP.fcodigo;
SELECTDISTINCTQ7A.clcodigo,Q7A.nome FROMQ7A,Q7
Solução03:
SELECTconsulta1.clcodigo,consulta1.nome
FROM((SELECTc.clcodigo,c.nome,c.cidade,COUNT(DISTINCTp.prcodigo)AStotal FROMclientescINNERJOINpedidospeONpe.clcodigo=c.clcodigo
INNERJOINitens_pedidosipONip.pecodigo=pe.pecodigo INNERJOINprodutospONp.prcodigo=ip.prcodigo GROUPBYc.clcodigo,c.nome,c.cidade
ORDERBYc.clcodigo,c.nome)ASconsulta1
INNERJOIN(SELECTf.cidade,COUNT (DISTINCTp.prcodigo)AStotal_cidade FROMfornecedoresf
INNERJOINfornece_produtosfpONfp.fcodigo=f.fcodigo INNERJOINprodutospONp.prcodigo=fp.prcodigo GROUPBYf.cidade
8.
Crie
a
Visão
CLIENTES_ESPECIAIS
(
clcodigo
:integer,
nome:string,
telefone:string,
MCP:
real)
a
qual
contém
todos
os
clientes
que
satisfazem
a
uma
das
condições
abaixo:
(i)
tem
mais
de
10
pedidos
com
custo
maior
do
que
R$30.000,00.
(ii)
A
média
dos
custos
dos
seus
pedidos
é
maior
do
que
a
média
dos
pedidos
da
sua
cidade.
(**)
MCP
é
a
média
dos
custos
dos
pedidos
do
cliente.
Solução01:
CREATEVIEWQ8A(clcodigo,nome, cidade,pecodigo,custo)AS
SELECTCL.clcodigo,CL.nome,CL.cidade,PE.pecodigo,SUM(IP.quantidade*IP.valor) FROMCLIENTESCL,PEDIDOSPE,ITENS_PEDIDOSIP
WHERECL.clcodigo=PE.clcodigo ANDPE.pecodigo=IP.pecodigo GROUPBYCL.clcodigo,PE.pecodigo ORDERBYCL.clcodigo;
CREATEVIEWQ8B(cidade,mcp_cidade)AS SELECTV1.cidade,AVG(V1.custo) FROMQ8AV1
GROUPBYV1.cidade;
CREATEVIEWCLIENTES_ESPECIAIS(clcodigo,nome,telefone,mcp)AS SELECTCL.clcodigo,CL.nome,CL.telefone,AVG(V1.custo)
FROMCLIENTESCL,Q8A V1,Q8BV2 WHERECL.clcodigo=V1.clcodigo ANDCL.cidade=V2.cidade GROUPBYCL.clcodigo
Solução02:
CREATEVIEWAUX_COD_1(CLCODIGO)AS SELECTCL.CLCODIGO
FROMCUSTO_POR_PEDIDOV
INNERJOINCLIENTESCLONV.CLCODIGO=CL.CLCODIGO WHEREV.CUSTO>30000
GROUPBYCL.CLCODIGO
HAVINGCOUNT(V.PECODIGO)>10;
CREATEVIEWAUX_COD_2(CLCODIGO)AS SELECTCL.CLCODIGO
FROMCUSTO_POR_PEDIDOV
INNERJOINCLIENTESCLONV.CLCODIGO=CL.CLCODIGO GROUPBYCL.CLCODIGO
HAVINGAVG(CUSTO)>( SELECTAVG(CUSTO)
FROMCUSTO_POR_PEDIDOV2
INNERJOINCLIENTESCL2ONV2.CLCODIGO=CL2.CLCODIGO WHERECL.CIDADE=CL2.CIDADE);
CREATEVIEWCLIENTES_ESPECIAIS(CLCODIGO,NOME,TELEFONE,MCP)AS SELECTCL.CLCODIGO,CL.NOME,CL.TELEFONE,AVG(V0.CUSTO)
FROMCLIENTESCL
INNERJOINCUSTO_POR_PEDIDOV0ONV0.CLCODIGO=CL.CLCODIGO WHERECL.CLCODIGOIN(
SELECTV.CLCODIGOFROMAUX_COD_1V) ORCL.CLCODIGOIN(
SELECTV.CLCODIGOFROMAUX_COD_2V) GROUPBYCL.CLCODIGO;