Voltar para a lista de artigos Artigos
8 minutos de leitura

Como Usar CASE WHEN com SUM() em SQL

Neste artigo, você aprenderá o que é uma expressão CASE WHEN em SQL e como usá-la com uma função SUM() e uma declaração GROUP BY. Incluímos exemplos para facilitar o entendimento.

Saber como usar uma expressão CASE WHEN em SQL permite ampliar a visão sobre as várias possibilidades dentro da linguagem SQL. Com isso, você passará de um simples usuário que depende do que o SQL retorna para um usuário que está no comando, e que consegue estabelecer critérios específicos no SQL. Combinada com outras funções e declarações, tais como SUM() e GROUP BY, a expressão CASE WHEN é uma ferramenta poderosa para a criação de relatórios SQL complexos.

Você pode aprender mais sobre a declaração CASE WHEN e como utilizá-la com SUM() e GROUP BY em nosso curso prático Como Criar Relatórios Básicos em SQL. Para mais práticas em SQL, confira a nossa Trilha de Práticas em SQL com mais de 500 exercícios interativos.

CASE, CASE WHEN, CASE WHEN THEN ou CASE WHEN THEN ELSE?

Estritamente falando, trata-se de uma declaração CASE em SQL. Algumas vezes, ela é chamada de expressão CASE WHEN ou qualquer uma das outras que mencionei acima. Não se confunda; é tudo a mesma coisa. As cláusulas WHEN, THEN e ELSE fazem parte da declaração CASE.

Como Funciona uma Expressão CASE WHEN?

Você pode pensar nela como um equivalente SQL da construção IF-THEN-ELSE. Você deve já estar familiarizado com ela, principalmente se você já a utilizou no Excel ou em alguma outra linguagem de programação. De qualquer forma, vamos revisá-la aqui.

A construção IF-THEN-ELSE funciona assim: a declaração IF executa um teste lógico; ela verifica se uma expressão específica é verdadeira ou falsa. Se (IF) a expressão for verdadeira, ela atribuirá um determinado valor que você especificar; caso contrário, ela atribuirá um valor diferente, que você também especificar.

A estrutura da expressão CASE WHEN é a mesma. Ela faz um teste lógico; caso (CASE WHEN) a expressão seja verdadeira, ela então (THEN) atribuirá um valor específico a ela. Caso contrário (ELSE), ela atribuirá um valor diferente.

Vamos conferir a lógica e a sintaxe de CASE WHEN através de um exemplo.

Exemplo 1: A Expressão CASE WHEN

Temos uma tabela chamada resultado_prova que contém resultados de provas. As colunas são:

  • id: identificação do estudante.
  • nome: nome do estudante.
  • sobrenome: sobrenome do estudante.
  • nota: nota da prova.

A tarefa aqui é atribuir categorias de resultados da prova de acordo com a nota. Veja como fazer isso:

SELECT	
  nome,
  sobrenome,
  nota,
  CASE
    WHEN nota > 90 THEN 'Resultado excelente'
    WHEN nota > 70 THEN 'Resultado ótimo'
    WHEN nota > 50 THEN 'Resultado mediano'
    ELSE 'Resultado ruim'
  END AS categoria_nota
FROM resultado_prova
ORDER BY nota DESC;

A declaração SELECT seleciona o nome e o sobrenome dos alunos e suas respectivas notas nas provas a partir da tabela resultado_prova. Tudo normal até aqui. Depois disso é que vem a parte divertida! A declaração CASE, é claro, começa com a palavra-chave CASE. Depois disso, definimos as condições a serem verificadas pela declaração CASE e os valores a serem atribuídos; para isso, usamos WHEN e THEN. Por exemplo, se a nota for maior que 90, ela entra na categoria de "resultado excelente". Se for maior que 70, é um "resultado ótimo". Você não precisa declarar "menor que 90" de forma explícita; o SQL leva em conta outras condições para evitar resultados duplicados ou erros.

Seguindo a mesma lógica, cada nota acima de 50 é considerada um "resultado médio". Qualquer nota que não satisfaça qualquer uma das três condições acima é categorizada como um "resultado ruim"; lembre-se, ELSE é usado para atribuir o valor quando nenhuma das condições definidas por CASE e WHEN é atendida.

Uma declaração CASE é fechada por um END. Depois disso, você pode definir o nome da coluna na qual os resultados de sua declaração CASE serão armazenados; neste caso, é a coluna categoria_nota. Também ordenamos os resultados em ordem decrescente pela coluna de notas. Confira o resultado:

nomesobrenomenotacategoria_nota
BernardoChaves95Resultado excelente
LuísPert92Resultado excelente
GizelaCaravela73Resultado ótimo
CesarQuintela70Resultado mediano
KaioWashington40Resultado ruim
EtienneClara36Resultado ruim
MirtesChazelas32Resultado ruim
CosmeGallaccio29Resultado ruim
FredericoBravo16Resultado ruim
MarianneMariot8Resultado ruim

Note que uma condição ELSE não é obrigatória em uma declaração CASE. Vamos tentar omiti-la. Aqui está o mesmo código, mas sem a condição ELSE:

SELECT	
  nome,
  sobrenome,
  nota,
  CASE
    WHEN nota > 90 THEN 'Resultado excelente'
    WHEN nota > 70 THEN 'Resultado ótimo'
    WHEN nota > 50 THEN 'Resultado mediano'
  END AS categoria_nota
FROM resultado_prova
ORDER BY nota DESC;

Execute o código e observe seu resultado:

nomesobrenomenotacategoria_nota
BernardoChaves95Resultado excelente
LuísPert92Resultado excelente
GizelaCaravela73Resultado ótimo
CesarQuintela70Resultado mediano
KaioWashington40NULL
EtienneClara36NULL
MirtesChazelas32NULL
CosmeGallaccio29NULL
FredericoBravo16NULL
MarianneMariot8NULL

O código foi executado sem erros, mas o resultado é diferente. Não há mais a categoria "resultado ruim". Ao invés disso, há valores NULL. Lembre-se: quando as linhas não corresponderem a nenhuma das condições definidas, a declaração CASE retornará os valores NULL.

Se você quiser se aprofundar mais na sintaxe, este artigo super completo sobre a lógica por trás de CASE WHEN pode ser bastante útil.

Exemplo 2: A Expressão CASE WHEN com SUM() e GROUP BY

Agora a coisa fica séria! A expressão CASE WHEN é frequentemente usada junto da função SUM() em relatórios mais complexos, o que pode ser bem desafiador para iniciantes em SQL. Embora você provavelmente esteja acostumado a usar a função SUM() para somar valores, ela também pode ser usada para fazer contagens.

Este exemplo te ajudará a entender melhor o conceito. Usaremos a tabela materia que tem as seguintes colunas:

  • idA identificação da matéria.
  • nome: o nome da matéria.
  • numero_aulas: o número de aulas ao longo do ano.
  • departamento: o departamento onde a matéria é ensinada.

A tarefa aqui é contar o número de matérias obrigatórias e eletivas por departamento. Neste exemplo, toda matéria que tenha mais de 20 aulas durante o ano é considerada obrigatória. E aí, já sabe como resolver? Aqui vai a solução:

SELECT	
  departamento,
  SUM (CASE
    WHEN numero_aulas > 20 THEN 1
    ELSE 0
  END) AS materias_obrigatorias,
  SUM (CASE
    WHEN numero_aulas <= 20 THEN 1
    ELSE 0
  END) AS materias_eletivas
FROM materia
GROUP BY departamento;

Vamos analisar o código! Primeiro, ele seleciona a coluna de departamentos da tabela materia. Depois disso vem o uso curioso de um SUM() com um CASE WHEN. Esta expressão diz que sempre que o numero_aulas for superior a 20, o valor 1 será atribuído àquela linha. Se a condição não for atendida, o valor atribuído será igual a 0.

A função SUM() somará todas as linhas que têm o valor atribuído igual a 1. Pense um pouco: se você somar todos os 1s, o que você obterá? Exatamente, é o mesmo que se você tivesse contado as linhas cujo numero_aulas está acima de 20. Usar uma expressão CASE WHEN para atribuir valores 0 ou 1 às linhas da tabela é apenas um pequeno truque para fazer com que SUM() retorne o número de linhas exatamente como a função COUNT() faria. O número da matéria com mais de 20 aulas será mostrado na coluna materias_obrigatorias.

A mesma lógica se aplica à próxima expressão CASE WHEN. A única diferença é que a condição se refere a 20 aulas ou menos, com o resultado sendo mostrado na coluna materias_eletivas.

Finalmente, o resultado da consulta é agrupado pela coluna de departamentos. Eis o que esta consulta retornará como resultado:

departamentomaterias_obrigatoriasmaterias_eletivas
Economia21
Literatura20
Filosofia22

Se você estiver tendo problemas com GROUP BY, este artigo que explica a lógica por trás desta cláusula será muito útil. Agora, se você estiver procurando por exemplos interessantes, aqui está um artigo com cinco exemplos de usos de GROUP BY.

Vamos conferir mais um exemplo da expressão CASE WHEN. Dizem que a prática leva à perfeição, mas não é bem assim. Não existe perfeição. Apesar disso, ainda que a prática não te leve à perfeição, com ela seus códigos com certeza ficarão bem melhores.

Exemplo 3: Usando uma Expressão CASE WHEN com SUM() e GROUP BY

Neste último exemplo, vamos usar a tabela pedidos, que contém as seguintes colunas:

  • id: identificação do pedido.
  • preco_total: preço total do pedido.
  • data_do_pedido: data do pedido.
  • status: status do pedido.
  • pais_destino: país para onde o pedido deve ser enviado.

Sua tarefa é mostrar o número de pedidos enviados por país. Um pedido que foi enviado possui um status definido como "enviado" ou "entregue". Este código lhe dará o resultado desejado:

SELECT 
  pais_destino,
  SUM(CASE
    WHEN status = 'enviado' OR status = 'entregue' THEN 1
    ELSE 0
  END) AS pedido_enviado
FROM pedidos
GROUP BY pais_destino;

O código seleciona a coluna pais_destino a partir da tabela pedidos. Em seguida, usa uma expressão CASE WHEN para atribuir o valor 1 a todas as linhas com o status "enviado" ou "entregue". Todos os outros status terão o valor 0 atribuído a eles. A nova coluna é chamada pedido_enviado. Por fim, o resultado é agrupado de acordo com a coluna pais_destino. Aqui está o resultado:

pais_destinopedido_enviado
Holanda2
Polônia1
Espanha4

Caso você tenha interesse em utilizar a função SUM() de forma mais convencional, aqui está um artigo sobre o uso da função SUM() para criar resumos condicionais.

Começando a Desvendar as Possibilidades de Uso da Expressão CASE WHEN?

Espero que este artigo tenha sido útil para você entender a expressão CASE WHEN em geral, discutindo sua lógica e mostrando exemplos de como ela funciona. O uso das expressões CASE WHEN abre um enorme leque de possibilidades dentro do SQL. Essas expressões são ainda mais poderosas quando combinadas com funções agregadas como SUM(), mostrada aqui em dois exemplos.

Você pode aprender ainda mais no curso Como Criar Relatórios Básicos em SQL. Leia sobre o curso em um episódio da nossa série " Curso do Mês ". Para mais práticas em SQL, confira nossa Trilha de Práticas em SQL. Ela possui mais de 500 exercícios SQL e estamos sempre adicionando novos conteúdos!