Tema
Junções entre tabelas
Uma junção liga duas tabelas por um campo comum. É o que permite mostrar a região de uma venda quando a venda só guarda o identificador da loja.
O caso típico
Nos ficheiros da Nortada:
VendastemlojaId,produtoId,valor,data;LojastemlojaId,loja,cidade,regiao;ProdutostemprodutoId,produto,categoria,marca.
Para um gráfico de vendas por região são precisas duas tabelas: a medida vem de Vendas, a dimensão vem de Lojas.
Criar uma junção
No construtor, com as duas tabelas no canvas, use + adicionar no painel de relações e preencha:
| Escolha | Exemplo |
|---|---|
| Tabela da esquerda | Vendas |
| Campo da esquerda | lojaId |
| Tipo | inner |
| Tabela da direita | Lojas |
| Campo da direita | lojaId |
Aparece uma linha curva entre os cartões com a condição escrita por cima.
Os dois tipos
inner (só correspondências) — mantém apenas as linhas que casam dos dois lados. Uma venda cujo lojaId não exista na tabela de lojas desaparece do resultado.
left (todas as da esquerda) — mantém todas as linhas da tabela da esquerda; quando não há correspondência, os campos da direita ficam vazios.
Qual usar:
| Situação | Tipo |
|---|---|
| A tabela de referência está completa e quer-se só o que casa | inner |
| Quer-se ver o que não casa (vendas com loja desconhecida) | left |
| A tabela da direita cobre apenas parte dos casos (metas só de algumas lojas) | left |
Uma junção inner pode esconder um problema
Se um total baixou depois de acrescentar uma tabela, provavelmente há linhas sem correspondência a serem descartadas. Trocar para left mostra-as, com os campos da direita vazios — e ai percebe-se quantas são.
Várias junções
Uma consulta pode ligar três ou mais tabelas. No dashboard de exemplo, todas as consultas do ecrã principal ligam Vendas a Lojas e a Produtos:
Vendas.lojaId = Lojas.lojaId (inner)
Vendas.produtoId = Produtos.produtoId (inner)A razão não é só mostrar a região e a categoria — é fazer com que os filtros do dashboard alcancem todas as consultas. Um filtro sobre regiao só se aplica a consultas que conheçam esse campo. Ver Barra de filtros do ecrã.
O erro que duplica linhas
Esta é a armadilha clássica, e vale a pena reconhecê-la.
Uma junção só é segura quando o lado de referência tem um valor único pelo campo ligado. Se Lojas tiver duas linhas com o mesmo lojaId, cada venda dessa loja passa a aparecer duas vezes — e as somas duplicam.
Sinais de que aconteceu:
- um total que era 2 584 253 passou a ser 5 168 506, ou a um valor estranhamente próximo do dobro;
- uma contagem que subiu sem que tenham entrado dados novos;
- um gráfico onde uma categoria disparou sem razão.
Como confirmar: faça uma consulta simples sobre a tabela de referência com lojaId (dimensão) e COUNT (medida). Qualquer linha com contagem maior que um é um duplicado.
Junções e agregados
O agrupamento acontece depois da junção. Uma consulta que liga Vendas a Lojas, agrupa por regiao e soma valor soma as linhas de vendas — não as de lojas.
Isto é o comportamento certo, mas explica porque a duplicação acima e tão perigosa: as linhas duplicadas entram na soma como se fossem vendas reais.
Nomes iguais nas duas tabelas
Quando duas tabelas têm um campo com o mesmo nome (custo em Vendas e em Produtos), a coluna de output deve ter um nome de saída que os distinga: custoVenda e custoUnitario. Sem isso é fácil ler um pelo outro sem dar por nada.
Sem junção no modelo
O modelo de dados não guarda relações: cada consulta declara as suas. Isso significa duas coisas:
- há que repetir a junção em cada consulta que precise dela;
- uma junção mal feita afecta apenas essa consulta, e não todas as do dashboard.
Ver O modelo de dados.