5.5 Lógica condicional com CASE WHEN#

Além das consultas simples e funções agregadas, o SQL também permite a utilização de lógicas condicionais avançadas através da sintaxe CASE WHEN. Leitores usuários de planilhas eletrônicas logo notarão a semelhança com a função IF ELSE() e suas derivações.

O CASE WHEN é uma operação realizada em cima dos valores de uma ou mais colunas que retorna uma nova coluna com o resultado da condição:

SELECT
  CASE
    WHEN condicao1 THEN resultado1
    WHEN condicao2 THEN resultado2
    (...)
    ELSE resultado_se_falso
  END AS nome_nova_coluna
FROM tabela
GROUP BY <nome_do_campo1,nome_do_campo2, etc..>

No exemplo abaixo, classificamos os produtos da Northwind em diferentes categorias de preço usando o CASE WHEN:

%%sql
SELECT ProductName, UnitPrice,
 CASE
   WHEN UnitPrice >= 100 THEN "Alto Valor"
   WHEN UnitPrice > 50 and "UnitPrice" < 100 THEN "Médio Valor"
   ELSE "Baixo Valor"
 END AS ProductCategory
FROM 'Product'
LIMIT 10
ProductName UnitPrice ProductCategory
Chai 18 Baixo Valor
Chang 19 Baixo Valor
Aniseed Syrup 10 Baixo Valor
Chef Anton's Cajun Seasoning 22 Baixo Valor
Chef Anton's Gumbo Mix 21.35 Baixo Valor
Grandma's Boysenberry Spread 25 Baixo Valor
Uncle Bob's Organic Dried Pears 30 Baixo Valor
Northwoods Cranberry Sauce 40 Baixo Valor
Mishi Kobe Niku 97 Médio Valor
Ikura 31 Baixo Valor

Mas o que aconteceria se ao invés de simplesmente classificar os produtos nessa nova categoria, quiséssemos contar quantos produtos estão em cada uma? Para isso, basta aplicar uma consulta agregada COUNT utilizando nossa nova coluna como parte da cláusula GROUP BY:

%%sql

SELECT COUNT(ProductName) as num_produtos,
 CASE
   WHEN UnitPrice >= 100 THEN "Alto Valor"
   WHEN UnitPrice > 50 and "UnitPrice" < 100 THEN "Médio Valor"
   ELSE "Baixo Valor"
 END AS ProductCategory
FROM 'Product'
GROUP BY ProductCategory
num_produtos ProductCategory
2 Alto Valor
70 Baixo Valor
5 Médio Valor

Agora que criamos nossa categorização de produtos, podemos dar um passo a mais e usá-la para calcular nossas vendas totais por categoria. Mas como fazemos isso se essa coluna só existe em nossa consulta SQL e não no banco de dados em si? Para isso vamos utilizar o conceito da subquery (ou subconsulta). Até a proxima seção!