Respondi as questões usando PostgreSQL, por isso podem haver significativas diferenças na escrita do código, as quero apresentar as minhas soluções dos exercícios do 1 ao 8:
1 - Qual é o número de Clientes que existem na base de dados?
select count(*) from clientes;
2 - Quantos produtos foram vendidos no ano de 2022?
select count(*) as qntd_produtos_vendidos from (
select
produto_id
from itens_venda
group by produto_id
);
3 - Qual a categoria que mais vendeu em 2022?
select
nome_categoria as categoria_mais_vendeu_2022
from (
select
c.nome_categoria,
count(iv.venda_id) as qtd_vendas
from produtos p
join itens_venda iv on iv.produto_id = p.id_produto
join categorias c on c.id_categoria = p.categoria_id
join vendas v on v.id_venda = iv.venda_id
where extract(year from v.data_venda) = 2022
group by c.nome_categoria
order by qtd_vendas desc
limit 1
);
4 - Qual o primeiro ano disponível na base?
-- Trouxe as duas tabelas e colunas que contém datas
select * from (
select
extract(year from data_venda) as ano
from vendas
group by ano
order by ano
limit 1
) union (
select
extract(year from data_estoque) as ano
from produtos
group by ano
order by ano
limit 1
);
5 - Qual o nome do fornecedor que mais vendeu no primeiro ano disponível na base?
6 - Quanto ele vendeu no primeiro ano disponível na base de dados?
-- Fazendo a questão 5 acabei trazendo dados que respodem a questão 6. Também parti do pressuposto de que, por mais que eu saiba o ano mais antigo, a minha query tem que trazer essa informação a ser usada.
with cte_ano_mais_antigo_base as (
select
extract(year from data_venda) as ano_mais_antigo_base
from vendas
group by ano_mais_antigo_base
order by ano_mais_antigo_base
limit 1
),
cte_fornecedor_vendas_ano as (
select
f.nome as nome_fornecedor,
extract(year from v.data_venda) as ano,
count(v.id_venda) as qtd_vendas
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 fornecedores f on f.id_fornecedor = p.fornecedor_id
group by f.nome, ano
)
select
mab.ano_mais_antigo_base,
fva.nome_fornecedor,
fva.qtd_vendas
from cte_fornecedor_vendas_ano fva, cte_ano_mais_antigo_base mab
where mab.ano_mais_antigo_base = fva.ano
order by qtd_vendas desc
limit 1;
7 - Quais as duas categorias que mais venderam no total de todos os anos?
select
nome_categoria as categoria_mais_vendas
from (
select
c.nome_categoria,
count(iv.venda_id) as qtd_vendas
from produtos p
join itens_venda iv on iv.produto_id = p.id_produto
join categorias c on c.id_categoria = p.categoria_id
join vendas v on v.id_venda = iv.venda_id
group by c.nome_categoria
order by qtd_vendas desc
limit 2
);
8 - Crie uma tabela comparando as vendas ao longo do tempo das duas categorias que mais venderam no total de todos os anos.
with cte_joins_tabelas as ( -- Como os nomes não são repetidos, pude relacionar tudo sem problemas numa única CTE.
select
*
from produtos p
join itens_venda iv on iv.produto_id = p.id_produto
join categorias c on c.id_categoria = p.categoria_id
join vendas v on v.id_venda = iv.venda_id
),
cte_categorias_mais_vendas as ( -- Identifiquei primeiro as categorias mais vendidas
select
nome_categoria,
count(venda_id) as qtd_vendas
from cte_joins_tabelas
group by nome_categoria
order by qtd_vendas desc
limit 2
),
cte_qntd_vendas_categorias as ( -- Aqui eu separei as vendas por ano
select
nome_categoria,
count(venda_id) as qtd_vendas,
extract(year from data_venda) as ano
from cte_joins_tabelas
group by nome_categoria, ano
order by qtd_vendas desc
)
select
qvc.nome_categoria,
sum(case when qvc.ano = 2020 then qvc.qtd_vendas end) as vendas_2020,
sum(case when qvc.ano = 2021 then qvc.qtd_vendas end) as vendas_2021,
sum(case when qvc.ano = 2022 then qvc.qtd_vendas end) as vendas_2022,
sum(case when qvc.ano = 2023 then qvc.qtd_vendas end) as vendas_2023
from cte_qntd_vendas_categorias qvc, cte_categorias_mais_vendas cmv
where cmv.nome_categoria = qvc.nome_categoria -- Aqui montei a tabela final considerando os dados das categorias em comum com as duas CTEs anteriores
group by qvc.nome_categoria;