· 3 min de leitura
Juntamos duas bases reais de uma transportadora: 272 abastecimentos e 15 carregamentos, ligados pela
coluna Posto. A coluna Volume (l) carregado não apareceu no resultado, consertamos isso, e a
soma veio quinze vezes maior que a real.
O bug não era o join. Era a chave.
O que acontece quando a chave repete
Um join casa cada linha da esquerda com todas as linhas da direita que têm a mesma chave. Se a
chave é única dos dois lados, 272 linhas entram e 272 saem. Mas Posto não é único: os 15
carregamentos se distribuem por poucos postos, e cada abastecimento encontra vários carregamentos
daquele mesmo posto.
Resultado: as 272 linhas casaram 272/272, sem nenhuma órfã e sem erro visível. E com um
fan-out de 15. Cada valor de Volume (l) carregado foi copiado quinze vezes para o resultado.
Nenhuma ferramenta reclama disso. O Excel não reclama, o VLOOKUP não reclama, o SQL não reclama. A
planilha fica maior, o total fica maior, e nada na tela diz que a aritmética mudou de significado.
Por que isso é pior que um erro
Um erro para o trabalho. Isso não para: entrega um número plausível.
Se o volume real carregado era 40.000 litros, a soma depois do join dá 600.000. Ninguém olha 600.000 e pensa "isso é 15× o valor certo". Olha e pensa "nossa, carregamos bastante". O número passa pela reunião, entra no slide, vira meta.
É o pior tipo de defeito de dado: o que sobrevive à revisão porque não parece defeito.
O diagnóstico que denuncia
Duas checagens, nessa ordem.
1. A contagem de linhas mudou? Se a base da esquerda tinha 272 linhas e o resultado tem mais que 272, houve fan-out. Essa é a checagem de cinco segundos, e é a que quase ninguém faz, porque "juntar duas tabelas" soa como uma operação que preserva linhas, e não é.
2. A chave é única na base da direita? Conte os valores distintos da coluna de chave e compare com o número de linhas. Iguais: join seguro, linha a linha. Diferentes: toda soma, média e contagem da base da direita está multiplicada.
O que fazer em vez disso
Depende do que você quer, e essa é a pergunta que o join esconde:
- Quer o volume por posto? Então agregue a base da direita antes de juntar: some os
carregamentos por
Posto, e só então junte. Uma linha por posto, fan-out 1, soma correta. - Quer os abastecimentos enriquecidos com um atributo do posto? Junte só colunas descritivas (nome, região, tipo de contrato). Repetir um rótulo quinze vezes é inofensivo. Repetir um valor não é.
- Quer comparar os dois volumes? São duas perguntas diferentes, e a resposta é dois números lado a lado, não uma coluna derivada de outra.
A regra curta: nunca some uma coluna que veio do lado "muitos" de um join. Se precisa somar, agregue antes.
A parte que custa mais caro
Tornar a coluna visível não torna a soma correta.
Essa é a frase que ficou do caso. Gastamos o tempo no problema errado, "a coluna não veio", porque era o sintoma visível. O problema real estava uma camada abaixo, na cardinalidade da chave, e ele continuava inteiro depois do conserto.
Quando um número de relatório parece alto demais, a pergunta não é "de onde veio esse valor". É "quantas vezes esse valor está aqui".
Receba os próximos
Deixe seu e-mail e avisamos quando sair post novo. Nada além disso.