No livro Getting Started with SQL , Thomas Nield fala sobre uma técnica que ele chama de truque de caso zero/nulo :
Existe uma ferramenta simples, mas poderosa, que pode aplicar diferentes condições de filtragem a diferentes agregações. Podemos criar contagens totais separadas quando um tornado estava presente versus não presente em duas colunas separadas:
SELECT year, month, SUM(CASE WHEN tornado = 1 THEN precipitation ELSE 0 END) as tornado_precipitation, SUM(CASE WHEN tornado = 0 THEN precipitation ELSE 0 END) as non_tornado_precipitation FROM station_data WHERE year >= 1990 GROUP BY year, month
O que fizemos efetivamente foi nos livrar das condições WHERE quando tornado = 1 ou tornado = 0 e, em seguida, mover essas condições para expressões CASE dentro das funções SUM(). Se a condição for atendida, o valor da precipitação é adicionado à soma. Caso contrário, um 0 é adicionado, sem efeito. Fazemos isso para ambas as colunas, uma para quando um tornado estava presente e outra para quando um tornado não estava presente, respectivamente.
Você pode fazer com que a expressão CASE tenha quantos pares de condição/valor forem necessários, dando a você a capacidade de fazer interceptações de valores altamente particulares com suas agregações. Você também pode usar esse truque para emular crosstabs e tabelas dinâmicas, expressando agregações em colunas separadas em vez de linhas. Um exemplo comum disso é fazer a análise do ano atual/ano anterior, pois você pode expressar anos separados com colunas diferentes.
Como iniciante, essa técnica parece ser muito útil para resumir dados. Quero pesquisar essa técnica on-line para encontrar outras técnicas semelhantes em livros ou outros recursos.
O autor desse livro chama a técnica de "truque de caso zero/nulo". Mas quando eu google esse termo, não recebo muitos resultados.
Pergunta:
Existe um nome geralmente aceito para essa técnica? (que traria mais resultados ao pesquisar online)
É variadamente conhecido como:
Pode ser escrito explicitamente usando
CASE
ou usando equivalentementeFILTER
a sintaxe introduzida com SQL:2003, por exemploCOUNT(*) FILTER (WHERE tornado = 1)
. Atualmente Postgres, HSQLDB e SQLite suportam a nova sintaxe.O Excel (e possivelmente outro software de planilha) chama isso de " tabela dinâmica " porque você pega os grupos baseados em linhas e os gira essencialmente em 90 graus quando os coloca em colunas.
Como as pessoas estão familiarizadas com o termo, ele foi transferido para o mundo SQL. Exemplo
Observe que não é necessariamente a melhor maneira de fazer isso, pode haver outras técnicas, como agregação condicional (
FILTER
) e funções de janela disponíveis. (Mas eu não sei nada sobre Oracle.)