Fala, Daniel! tudo certo?
A respeito da última consulta, eu não estava muito contente porque achei muito verbosa, apesar de trazer os resultados em um formato útil que permitiu bons insights, foi necessário escrever a mesma condição varias vezes e acho que é difícil de interpretar pala própria leitura do SQL, mas até aquele momento eu não tinha conseguido escrever isso de outra forma. Agora que eu cheguei na última aula do curso SQLite online:
Análise de dados com SQL e aprendi sobre a cláusula WITH, resolvi reescrever aquela consulta, pensando em criar tabelas temporárias e transformar gradualmente os dados. Em primeiro lugar eu acrescentei uma coluna aceitável para definir se cada produto está dentro da faixa de preço. Com base nessa tabela eu criei a agregação por nome do produto, contando os aceitáveis, não aceitáveis e total, por último selecionei as colunas na ordem que eu queria exibir e acrescentei o percentual de aceitação. Vejo que usar a cláusula WITH melhora muito a legibilidade do SQL, porque é possível escrever cada transformação de cima para baixo, como um pipeline de transformações. Em contra partida, usar subconsultas obriga quem está analisando o código SQL a ler de dentro para fora, localizando as subconsultas mais simples e entendendo cada uma que seria base da consulta mais cosulta mais complexa. Por fim, vou acrescentar como a consulta ficou após as modificações.
WITH
ProdutosComTagDeAceitacao AS (
SELECT
*,
(nome_produto = 'Bola de Futebol' AND preco BETWEEN 20 AND 100
OR nome_produto = 'Chocolate' AND preco BETWEEN 10 AND 50
OR nome_produto = 'Celular' AND preco BETWEEN 80 AND 5000
OR nome_produto = 'Livro de Ficção' AND preco BETWEEN 10 AND 200
OR nome_produto = 'Camisa' AND preco BETWEEN 80 AND 200) AS aceitavel
FROM produtos
),
ProdutosAgregadosPorAceitacao AS (
SELECT
nome_produto,
SUM(aceitavel) AS aceitaveis,
SUM(NOT aceitavel) AS inaceitaveis,
COUNT(*) AS total FROM ProdutosComTagDeAceitacao
GROUP BY nome_produto
)
SELECT
nome_produto,
aceitaveis,
inaceitaveis,
ROUND(aceitaveis * 100.0 / total, 2) AS percentual_aceitacao,
total
FROM ProdutosAgregadosPorAceitacao;