1
resposta

[Projeto] Mão na Massa

Eu fiz os exercícios e o curso adaptando para o PostgreSQL, por isso pode estar um pouco diferente para quem estava usando SQLite Online.

-- 1) Traga todos os dados da cliente Maria Silva.
select * from clientes where nome = 'Maria Silva';

-- 2) Busque o ID do pedido e o ID do cliente dos pedidos onde o status esteja como entregue.

select
    p.id as idpedido,
    p.idcliente,
    p.status
from pedidos p
join clientes c on c.id = p.idcliente
where status = 'Entregue';

-- 3) Retorne todos os produtos onde o preço seja maior que 10 e menor que 15.

select * from produtos
where preco between 10.01 and 14.99;

-- 4) Busque o nome e cargo dos colaboradores que foram contratados entre 2022-01-01 e 2022-06-30.

select * from colaboradores
where datacontratacao between '2022-01-01' and '2022-06-30';

-- 5) Recupere o nome do cliente que fez o primeiro pedido.

select
    c.nome
from pedidos p
join clientes c on c.id = p.idcliente
order by datahorapedido asc
limit 1;

-- 6) Liste os produtos que nunca foram pedidos.

select
    p.nome as produto,
    coalesce(sum(i.quantidade), 0) as total_pedidos
from itenspedidos i
right join produtos p on p.id = text(i.idproduto)
group by p.nome
having sum(i.quantidade) is null;

-- 7) Liste os nomes dos clientes que fizeram pedidos entre 2023-01-01 e 2023-12-31.

select
    p.idcliente,
    c.nome as nome_cliente
from pedidos p
join clientes c on c.id = p.idcliente
where date(datahorapedido) between '2023-01-01' and '2023-12-31'
group by p.idcliente, c.nome;

-- 8) Recupere os nomes dos produtos que estão em menos de 15 pedidos.

select
    p.nome as produtos,
    case
        when sum(i.quantidade) is null then 0
        else sum(i.quantidade)
    end as total_pedidos
from itenspedidos i
right join produtos p on p.id = text(i.idproduto)
group by p.nome
having sum(i.quantidade) < 15 or sum(i.quantidade) is null;

-- 9) Liste os produtos e o ID do pedido que foram realizados pelo cliente "Pedro Alves" ou pela cliente "Ana Rodrigues".

select
    c.nome as nome_cliente,
    ip.idpedido,
    pr.nome as produto
from itenspedidos ip
join produtos pr on text(ip.idproduto) = pr.id
join pedidos pe on pe.id = ip.idpedido
join clientes c on c.id = pe.idcliente
where c.nome in ('Pedro Alves', 'Ana Rodrigues')
order by c.nome;

-- 10) Recupere o nome e o ID do cliente que mais comprou(valor) no Serenatto.

select
    *
from (
    select
        c.nome,
        sum(ip.quantidade * ip.precounitario) as valor_total
    from itenspedidos ip
    join pedidos pe on pe.id = ip.idpedido
    join clientes c on c.id = pe.idcliente
    group by c.nome
)
order by valor_total desc
limit 1;

-- Optei por criar uma subquery para fazer a ordenação e limitação separado e não ter que passar o método de agregação no ORDER BY. Isso não é uma boa prática pois nem todo SQL comporta essa leitura.

1 resposta

Tudo bem, Jackson? Espero que sim!

Ficou excelente as adaptações das consultas para o PostgreSQL, mantendo clareza nos JOINs, uso consistente de alias e cuidado ao lidar com NULL, principalmente com coalesce e having. Sua decisão de usar subquery para organizar a ordenação deixa o raciocínio mais legível do jeito que você explicou.

Continue se dedicando aos estudos e qualquer dúvida, compartilhe.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!