EXCEPT no Power BI: compare listas e encontre ausências
Usar EXCEPT no Power BI ajuda a responder quais códigos aparecem em uma lista e não aparecem em outra. Essa comparação é útil para revisar produtos movimentados fora de uma relação aprovada, desde que as duas listas representem o mesmo universo de referência. O resultado aponta uma diferença que exige investigação.
O exemplo deste roteiro é hipotético e utiliza uma tabela de vendas e um catálogo aprovado. Não se trata de reconciliar dinheiro ou unidades vendidas. O foco é comparar pertencimento a conjuntos de códigos, preservando o significado dos filtros e a direção da pergunta.
1. Entenda a direção de EXCEPT no Power BI
A referência oficial de EXCEPT em DAX define o retorno como as linhas da primeira tabela que não aparecem na segunda. DAX é a linguagem de expressões utilizada nas medidas do exemplo. Inverter as tabelas muda a pergunta e pode produzir outro conjunto de resultados.
Considere vendas com os produtos A, B e C e uma lista aprovada com A, B e D. Vendas menos lista aprovada retorna C; lista aprovada menos vendas retorna D. C exige verificar autorização ou cadastro, enquanto D apenas não apareceu nas vendas do recorte, sem provar que existe um problema comercial.
2. Prepare códigos com significado consistente
Declare ProdutoID como texto nas duas fontes e confirme a regra de identificação. Confira espaços, zeros iniciais, códigos antigos e mudanças de nomenclatura. A preparação precisa preservar a identidade do produto; remover caracteres indiscriminadamente pode juntar códigos que representam itens diferentes e apagar justamente a divergência procurada.
Monte uma amostra com identificadores conhecidos e registre quais deveriam coincidir. Para revisar o processo de transformação, consulte o perfil de dados no Power Query. O teste de qualidade deve acontecer antes da comparação, pois uma diferença de representação pode parecer uma ausência real no cadastro aprovado.
3. Defina qual versão do catálogo será comparada
Neste exemplo, Catalogo contém uma única lista aprovada vigente na extração. Vendas contém os movimentos que serão filtrados por período. Mantenha essas duas tabelas sem relacionamento direto para o teste inicial e registre a data de referência do catálogo, evitando que a seleção das vendas reduza a lista de comparação.
Se a pergunta for histórica, uma lista atual não basta. Prepare as autorizações válidas no período analisado antes de comparar os códigos. Um produto vendido no passado e retirado hoje poderia aparecer como divergência indevida; o painel precisa explicitar se verifica a autorização atual ou aquela existente quando a venda ocorreu.
4. Construa conjuntos distintos e trate campos vazios
A função VALUES, aplicada a uma coluna, retorna seus valores distintos no contexto de filtro. Ela também pode produzir um valor em branco. Na medida proposta, retiramos códigos em branco dos dois conjuntos e tratamos essa falta de identificação como uma pendência separada de qualidade.
Essa escolha evita que dez vendas do mesmo produto sejam interpretadas como dez códigos diferentes. Ao mesmo tempo, ela significa que a medida não identifica duplicidades na fonte. Mantenha um controle próprio de linhas sem código e de registros repetidos, pois normalizar a comparação não dispensa a conferência da base original.
5. Crie uma medida para contar as diferenças
O código abaixo assume que os nomes das tabelas e colunas foram criados conforme o exemplo. As expressões usam vírgula como separador. Crie a medida em um modelo de teste e confira os resultados conhecidos antes de adaptar a fórmula a um relatório com relações e filtros adicionais.
Produtos fora da lista =
VAR Observados =
FILTER(
VALUES(Vendas[ProdutoID]),
NOT ISBLANK(Vendas[ProdutoID])
)
VAR Permitidos =
FILTER(
VALUES(Catalogo[ProdutoID]),
NOT ISBLANK(Catalogo[ProdutoID])
)
RETURN
COALESCE(
COUNTROWS(EXCEPT(Observados, Permitidos)),
0
)
A documentação de COUNTROWS descreve a contagem de linhas da tabela resultante. COALESCE permite retornar zero quando essa contagem estiver em branco. No cenário proposto, zero significa que nenhum código identificado ficou fora da lista, e não que a fonte inteira passou em todas as validações.
6. Confira o resultado com uma lista de detalhes
Adicione um cartão com a medida e uma tabela com Vendas[ProdutoID] e a mesma medida. Nesse modelo de teste, filtre o visual para mostrar valores maiores que zero. Cada linha deverá indicar um produto observado fora do catálogo, permitindo conferir o conjunto em vez de aprovar apenas o total.
Para o exemplo A, B e C contra A, B e D, espere um produto no cartão e C no detalhe. Depois, inclua outra venda de C: a contagem de códigos deve continuar igual a um. Esse teste confirma que a medida responde sobre produtos distintos, e não sobre quantidade de lançamentos comerciais.
7. Teste como cada filtro afeta as duas listas
Selecione um período sem vendas de C e confira se a divergência desaparece no recorte. A lista aprovada, neste modelo, permanece a mesma. Em um relatório real, documente quais filtros devem atuar sobre movimentos, catálogo ou ambos; uma seleção de unidade pode exigir uma lista de autorização específica por unidade.
Se o mesmo produto for observado em duas regiões, ele pode aparecer nas duas linhas regionais e apenas uma vez no total geral. Isso é esperado em uma contagem distinta. Consulte o roteiro de validação de totais em DAX antes de substituir o total por uma soma das linhas e mudar a pergunta respondida.
8. Compare pares de campos quando a regra exigir
Uma autorização pode valer para produto e unidade juntos. Nesse caso, comparar somente ProdutoID é insuficiente: uma venda na unidade errada passaria despercebida. Prepare duas tabelas com o mesmo par de campos e alinhe a ordem, usando projeções explícitas quando necessário para tornar a comparação revisável.
EXCEPT exige a mesma quantidade de colunas e compara por posição, sem converter os tipos automaticamente. Mantenha o mesmo tipo em cada posição. Em um teste hipotético, produto A na unidade Sul deve ser distinto de produto A na unidade Norte quando a autorização se limita a uma dessas combinações.
9. Separe ausência de código e divergência de quantidade
Um produto presente nas duas listas será removido da diferença mesmo que as quantidades sejam incompatíveis. Por isso, EXCEPT não substitui uma reconciliação de valores por chave. Para comparar quantidades ou preços, prepare uma análise específica, com medidas para cada origem e conferência das diferenças numéricas.
Quando precisar trazer atributos de uma fonte para outra, consulte o roteiro de mesclagem no Power Query. Escolha a técnica pela pergunta: associação de atributos, diferença de conjuntos e reconciliação numérica têm objetivos distintos. Não interprete o sucesso de uma delas como validação automática das demais.
10. Encaminhe diferenças com evidência e responsável
Produza uma lista com código, recorte, catálogo de referência e motivo da revisão. As causas podem incluir autorização ausente, atraso de cadastro ou transformação incorreta; o resultado da função não determina qual delas ocorreu. Atribua a investigação a quem consegue conferir a fonte e corrigir o processo apropriado.
Após cada correção, execute novamente os casos conhecidos e confira a diferença nas duas direções. Preserve a versão utilizada para permitir reprodução do diagnóstico. Em DirectQuery, observe a restrição documentada de EXCEPT em colunas calculadas e regras de segurança; valide o desenho no seu modelo antes de ampliar a solução para produção.
