Relatório exibe campo em branco ao invés de valor negativo em diferenças

Ao criar métricas no GoodData (MAQL) que realizam operações aritméticas entre fatos — como soma, subtração, multiplicação ou divisão — é comum observar um comportamento inesperado quando um dos valores envolvidos não possui dados (NULL ou em branco) .

Como posso solucionar isto?

Boa tarde Felipe,

Ao criar métricas no GoodData (MAQL) que realizam operações aritméticas entre fatos — como soma, subtração, multiplicação ou divisão — é comum observar um comportamento inesperado quando um dos valores envolvidos não possui dados (NULL ou em branco).

Exemplo do comportamento observado

  • Valor A = vazio (NULL ou em branco)
  • Valor B = 100

Resultado da métrica: Valor A - Valor B = vazio (NULL)

Comportamento esperado pelo usuário

  • Valor A deveria ser tratado como 0
  • Resultado esperado: 0 - 100 = -100

Solução
Por que isso acontece no GoodData?
No GoodData, operações aritméticas envolvendo valores nulos retornam NULL.
Isso significa que:

  • 100 + NULL = NULL
  • 100 - NULL = NULL
  • NULL * 10 = NULL

Esse comportamento é esperado pelo MAQL, pois não é possível executar um cálculo matemático quando um dos operandos não existe.
Por isso, qualquer métrica que não trate explicitamente valores nulos pode “sumir” do relatório, mesmo quando faria sentido exibir um valor zero ou negativo.

Vamos mostrar alguns exemplos de métrica e seus possíveis retornos de acordo com o contexto de DIM e FACT
Ex:

DIM Possui histórico no GoodData? FATO FATO FATO Métrica Métrica Métrica Métrica Métrica Métrica
PRODUTO BRUTO BRUTO BRUTO ANTERIOR COEF % BRUTO - (BRUTO ANT*COEF) BRUTO - (IFNULL(BRUTO ANT,0)*IFNULL(COEF),0) IFNULL(BRUTO,0) - (IFNULL(BRUTO ANT,0)*IFNULL(COEF),0) 0 + IFNULL(BRUTO,0) - (IFNULL(BRUTO ANT,0)*IFNULL(COEF),0) 0 + IFNULL(BRUTO,0) - SUM((IFNULL(BRUTO ANT,0)*COEF)) 0 + IFNULL(BRUTO, 0) - IFNULL(SUM(IFNULL(BRUTO ANT, 0) * COEF), 0)
ARROZ SIM 500 400 10% 46000% 46000% 46000% 460 460 460
FEIJAO SIM 200 VAZIO 5% Tira a linha 20000% 20000% 200 200 200
MACARRAO SIM VAZIO VAZIO vazio Tira a linha Tira a linha Tira a linha 0 0 0
FRANGO SIM VAZIO 50 3% Tira a linha Tira a linha -1,5 -1,5 -1,5 -1,5
CARNE SIM VAZIO 50 VAZIO Tira a linha Tira a linha 0 0 Tira a linha 50
PEIXE NÃO VAZIO VAZIO vazio Tira a linha Tira a linha Tira a linha Tira a linha Tira a linha Tira a linha

O que cada exemplo de métrica acima realiza?

BRUTO - (BRUTO ANT*COEF) = calcula a diferença entre o valor bruto atual (BRUTO) e um valor ajustado do valor bruto anterior (BRUTO ANT), multiplicado por um coeficiente (COEF).

*BRUTO - (IFNULL(BRUTO ANT,0)IFNULL(COEF),0) = A métrica calcula se o valor bruto atual é maior ou menor do que o esperado, considerando o valor bruto anterior ajustado por um coeficiente, e trata valores nulos como zero.

*IFNULL(BRUTO,0) - (IFNULL(BRUTO ANT,0)IFNULL(COEF),0) = A métrica determina se o valor bruto atual é maior ou menor que o esperado, considerando o valor bruto anterior ajustado por um coeficiente. O uso de IFNULL garante que, caso algum dos valores seja nulo, ele seja tratado como zero

*0 + IFNULL(BRUTO,0) - (IFNULL(BRUTO ANT,0)IFNULL(COEF),0) = A métrica avalia se o valor bruto atual é maior ou menor do que o esperado, considerando o valor bruto anterior ajustado por um coeficiente. O uso de 0 + não altera o resultado, mas pode ser uma prática para garantir que a operação de subtração seja sempre numérica. A utilização de IFNULL assegura que valores nulos não causem erros nos cálculos

*0 + IFNULL(BRUTO,0) - SUM((IFNULL(BRUTO ANT,0)COEF)) = O IFNULL(BRUTO, 0) garante que, se o valor bruto atual for nulo, ele seja tratado como zero.
O 0 + é uma prática que não altera o valor, mas pode ser usado para garantir que a operação de subtração seja sempre numérica. A parte SUM((IFNULL(BRUTO ANT, 0) * COEF)) calcula a soma dos produtos do valor bruto anterior (substituído por zero se nulo) e o coeficiente.
Essa soma pode incluir múltiplos registros, dependendo do contexto em que a métrica é utilizada.

0 + IFNULL(BRUTO, 0) - IFNULL(SUM(IFNULL(BRUTO ANT, 0) * COEF), 0) = A métrica fornece a diferença entre o valor bruto atual e a soma do valor bruto anterior ajustado pelo coeficiente. O resultado pode indicar se o desempenho atual está acima ou abaixo do esperado, considerando o histórico ajustado.

Obs:

  • Se algum lançamento passado tiver movimentação, ele consegue trazer esta linha no relatório

  • Se nunca houve lançamento para uma dimensão, apenas tem ela em cadastro, mas sem movimentação, não será possível trazer essa linha, pois nunca teve na tabela de VALOR BRUTO

Muito útil a tabela com os cenários. Ajuda bastante a visualizar onde cada versão da métrica falha.

Frequentemente esqueço de tratar o IFNULL dentro da agregação (SUM), e é justamente aí que o cálculo costuma quebrar quando há filtros aplicados. Essa solução definitiva cobre todos os casos de borda.

1 curtida