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