SQL: somando várias condições em uma mesma consulta

Wesley Muller
2 min readSep 20, 2023

--

Imagem retirada do Site Defender

Saber realizar consultas no SQL tem deixado de ser uma tarefa exclusiva para pessoas que executam tarefas de dados. Quando o assunto são pequenas análises e estudos, saber utilizar a função de soma e média é indispensável.

Nesse artigo, vamos aprender como usar algumas funções de agregação — sum, avg, max, min — de uma forma mais otimizada.

Perceba, no exemplo a seguir, a operação de soma é realizada para situações onde a flag closed_account é igual a 0. Para somar a receita na condição da flag onde os clientes encerraram a conta (igual a 1), seria necessário realizar mais uma consulta.

SELECT year
,month
,SUM(revenue) as revenue

FROM consumer

WHERE closed_account = 0
GROUP BY month, year

No exemplo hipotético, não seria o fim do mundo abrir uma nova consulta e alterar closed_account = 1 no WHERE. Mas entenda, se fosse necessária a soma condicionada a outras situações de filtro ou ainda a soma de várias características desse cliente, ficar criando várias consultas para cada variação seria bastante custoso, tanto do ponto de vista de tempo, quanto computacional.

Mas então vamos as dicas que interessam…

Uma forma de realizar essa consulta seria usando o CASE WHEN associado ao que vamos chamar de truque do zero.

SELECT year
,month
,SUM(CASE WHEN closed_account = 0 THEN revenue ELSE 0 end) as revenue_non_closed
,SUM(CASE WHEN closed_account = 1 THEN revenue ELSE 0 end) as revenue_closed

FROM consumer

GROUP BY year, month

O ELSE retorna 0 (zero) quando a condição não é atendida e garante que o valor seja somado apenas para o filtro da condição — uma vez que a soma de zero não altera nada.

Usando o CASE WHEN associado ao truque do zero é possível realizar somas. Para outras funções de agregação, outro truque ajuda a simplificar e otimizar consultas: o truque do null.

Para encontrar os valores mínimos, máximos e média, utiliza-se o ELSE associado ao null.

select year
,month
,MAX(CASE WHEN closed_account = 0 THEN revenue ELSE NULL end) as max_revenue_non_closed
,MAX(CASE WHEN closed_account = 1 THEN revenue ELSE NULL end) as max_revenue_closed

FROM consumer

GROUP BY year, month

O uso do null traz a garantia que valores de determinadas condições não sejam considerados.

Isso é tudo pessoal!!!

Espero muito que esse texto possa enriquecer suas análises e, de alguma forma, te ajudar 🙌😁.

Para conectar comigo no Linkedin, esse aqui é o link. Para me seguir aqui no Medium, é nesse aqui.

--

--

Wesley Muller

Sou formado em engenharia elétrica e pós-graduado em analytics. Aqui falo sobre análise de dados e de negócios 📊📈.