12th Sep 2022 8 minutos de leitura Como Usar CASE WHEN com SUM() em SQL Tihomir Babic sql aprender sql group by Índice CASE, CASE WHEN, CASE WHEN THEN ou CASE WHEN THEN ELSE? Como Funciona uma Expressão CASE WHEN? Exemplo 1: A Expressão CASE WHEN Exemplo 2: A Expressão CASE WHEN com SUM() e GROUP BY Exemplo 3: Usando uma Expressão CASE WHEN com SUM() e GROUP BY Começando a Desvendar as Possibilidades de Uso da Expressão CASE WHEN? 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! Tags: sql aprender sql group by