Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Projeto] Resolução: Hora da Prática

Confesso que alguns desafios foram bem complicados, mas consegui.
E alguns até estão diferentes do professor.

-- 01
SELECT count(id_cliente) as Qtd_Total_Clientes
FROM clientes;

-- 02
SELECT count(iv.produto_id) as Qtd_Produtos_Vendidos
from vendas v
join itens_venda iv on iv.venda_id = v.id_venda
WHERE STRFTIME('%Y', v.data_venda) = '2022';

-- 03
SELECT COUNT(iv.produto_id) as Qtd_Vendas, c.nome_categoria as Categoria
from vendas v
INNER join itens_venda iv on iv.venda_id = v.id_venda
INNER JOIN produtos p on p.id_produto = iv.produto_id
INNER JOIN categorias c on c.id_categoria = p.categoria_id
WHERE STRFTIME('%Y', v.data_venda) = '2022'
GROUP by c.nome_categoria
ORDER by Qtd_Vendas DESC
LIMIT 1;

-- 04
SELECT MIN(STRFTIME('%Y', data_venda)) as Ano
FROM vendas;

-- 05
SELECT f.nome as Fornecedor, COUNT(*) as Qtd_Vendas
FROM itens_venda iv
INNER join vendas v on iv.venda_id = v.id_venda
INNER JOIN produtos p on p.id_produto = iv.produto_id
INNER JOIN fornecedores f on f.id_fornecedor = p.fornecedor_id
WHERE STRFTIME('%Y', data_venda) = '2020'
GROUP BY Fornecedor
order by Qtd_Vendas DESC
limit 1;

-- 06
SELECT f.nome as Fornecedor, COUNT(*) as Qtd_Vendas, STRFTIME('%Y', data_venda) as Ano
FROM itens_venda iv
INNER join vendas v on iv.venda_id = v.id_venda
INNER JOIN produtos p on p.id_produto = iv.produto_id
INNER JOIN fornecedores f on f.id_fornecedor = p.fornecedor_id
WHERE Ano = '2020'
GROUP BY Fornecedor
order by Qtd_Vendas DESC
limit 1;

-- 07
SELECT COUNT(*) as Qtd_Vendas, c.nome_categoria as Categoria
FROM itens_venda iv
INNER JOIN produtos p on p.id_produto = iv.produto_id
INNER JOIN categorias c on c.id_categoria = p.categoria_id
GROUP by Categoria
ORDER by Qtd_Vendas DESC
LIMIT 2;

-- 08
SELECT "Ano/Mês",
SUM(CASE WHEN Categoria = 'Eletrônicos' THEN Qtd_Vendas ELSE 0 END) AS Eletrônicos, 
SUM(CASE WHEN Categoria = 'Vestuário' THEN Qtd_Vendas ELSE 0 END) AS Vestuário
FROM(
    SELECT COUNT(*) AS Qtd_Vendas, strftime('%Y/%m', v.data_venda) AS "Ano/Mês", c.nome_categoria AS Categoria
    FROM itens_venda iv
    JOIN vendas v ON v.id_venda = iv.venda_id
    JOIN PRODUTOS p ON p.id_produto = iv.produto_id
    JOIN CATEGORIAS c ON c.id_categoria = p.categoria_id
    WHERE Categoria IN ('Eletrônicos', 'Vestuário')
    GROUP BY "Ano/Mês", Categoria
    ORDER BY "Ano/Mês", Categoria
)
GROUP BY "Ano/Mês";

-- 09
SELECT Nome_Categoria, Qtd_Vendas, ROUND(100.0 * Qtd_Vendas / Qtd_Total,2) || '%' as Porcentagem_sobre_Total
From (
  SELECT c.nome_categoria as Nome_Categoria, COUNT(iv.produto_id) as Qtd_Vendas,
  (SELECT COUNT(iv.produto_id) from itens_venda iv INNER join vendas v on v.id_venda = iv.venda_id where STRFTIME('%Y', v.data_venda) = '2022') as Qtd_Total
  from itens_venda iv
  INNER JOIN vendas v on v.id_venda = iv.venda_id
  INNER JOIN produtos p on p.id_produto = iv.produto_id
  INNER JOIN categorias c on c.id_categoria = p.categoria_id
  WHERE STRFTIME('%Y', v.data_venda) = '2022'
  GROUP by Nome_Categoria, Qtd_Total
  ORDER by Qtd_Vendas DESC
);

-- 10
with Pior_Categoria as (
    SELECT Nome_Categoria, Qtd_Vendas, Qtd_Venda_Total, ROUND(100.0 * Qtd_Vendas / Qtd_Venda_Total, 2) || '%' AS Porcentagem
    From (
      SELECT c.nome_categoria as Nome_Categoria, COUNT(iv.produto_id) as Qtd_Vendas, 
      (SELECT COUNT(iv.produto_id) from itens_venda iv INNER join vendas v on v.id_venda = iv.venda_id where STRFTIME('%Y', v.data_venda) = '2022') as Qtd_Venda_Total
      from itens_venda iv
      INNER JOIN vendas v on v.id_venda = iv.venda_id
      INNER JOIN produtos p on p.id_produto = iv.produto_id
      INNER JOIN categorias c on c.id_categoria = p.categoria_id
      WHERE STRFTIME('%Y', v.data_venda) = '2022'
      GROUP by Nome_Categoria
      ORDER by Qtd_Vendas
      LIMIT 1)
), Melhor_Categoria as (
    SELECT Nome_Categoria, Qtd_Vendas, Qtd_Venda_Total, ROUND(100.0 * Qtd_Vendas / Qtd_Venda_Total, 2) || '%' AS Porcentagem
    From (
      SELECT c.nome_categoria as Nome_Categoria, COUNT(iv.produto_id) as Qtd_Vendas,
      (SELECT COUNT(iv.produto_id) from itens_venda iv INNER join vendas v on v.id_venda = iv.venda_id where STRFTIME('%Y', v.data_venda) = '2022') as Qtd_Venda_Total
      from itens_venda iv
      INNER JOIN vendas v on v.id_venda = iv.venda_id
      INNER JOIN produtos p on p.id_produto = iv.produto_id
      INNER JOIN categorias c on c.id_categoria = p.categoria_id
      WHERE STRFTIME('%Y', v.data_venda) = '2022'
      GROUP by Nome_Categoria
      ORDER by Qtd_Vendas DESC
      LIMIT 1)
)
SELECT mc.Qtd_Vendas as Vendas_Melhor_Categoria_2022, 
pc.Qtd_Vendas as Vendas_Pior_Categoria_2022,
ROUND((pc.Porcentagem * 100.0)/ mc.Porcentagem - 100, 2) || '%' AS Diferença_Melhor_X_Pior_Porcentagem
from Melhor_Categoria mc, Pior_Categoria pc;
1 resposta
solução!

Ei! Tudo bem?

Que ótimo que você conseguiu finalizar o desafio! Parabéns pela dedicação e resiliência, é comum que alguns problemas de SQL mais avançados sejam complicados, mas o fato de você ter conseguido resolvê-los é um grande indicador do seu aprendizado.

Não se preocupe se alguns resultados ou abordagens ficaram diferentes do professor, pois na tecnologia podemos resolver o mesmo problema de várias formas. Isso é ótimo para sua prática e conhecimento.

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!