> ## Documentation Index
> Fetch the complete documentation index at: https://ajuda.medemerge.com.br/llms.txt
> Use this file to discover all available pages before exploring further.

# Expressões

> Fórmulas de planilha no construtor visual: colunas calculadas, filtros por condição e métricas como taxas.

Expressões são fórmulas, como as de uma planilha, que você escreve no construtor visual. Com elas, um indicador calcula o que as colunas não trazem prontas: uma taxa, um tempo de espera, uma faixa, a comparação com o ano anterior.

A sintaxe é a mesma do Metabase. Quem já escreveu expressões lá não precisa reaprender.

## Onde as expressões entram

| Onde | O que a expressão faz | Exemplo |
| - | - | - |
| **Colunas personalizadas** (**+ coluna**) | Calcula um valor para cada linha, como uma coluna nova. | `[minutos_espera] / 60` |
| **Filtrar** (**+ filtro por expressão**) | Diz, para cada linha, se ela fica: dá verdadeiro ou falso. | `[minutos_espera] > 30 AND [setor] = "PS"` |
| **Resumir** (**+ métrica**, **Expressão personalizada**) | Resume as linhas num número, com agregações. | `CountIf(notEmpty([codigo_internacao])) / Count()` |

Numa junção, o botão **ƒx** de cada lado da condição também aceita uma expressão, calculada linha a linha.

<Note>
  As colunas dos exemplos, como `[minutos_espera]` e `[chegada]`, são fictícias. Troque pelas colunas do seu indicador.
</Note>

## Agregações e funções por linha

Há dois tipos de função:

* **Funções por linha** calculam um valor para cada linha: `lower([setor])`, `datetimeDiff([chegada], [alta], "day")`, `case(…)`. Cabem em qualquer lugar.
* **Agregações** resumem muitas linhas num número: `Count()`, `Sum([valor])`, `CountIf(…)`. Só cabem em **Resumir**. As funções de janela, como `Offset` e `SamePeriodLastYear`, também.

Numa métrica, você pode combinar agregações numa conta, e usar funções por linha dentro delas: `Sum([valor]) / Count()`, `CountIf(lower([setor]) = "ps")`.

## Como escrever

* **Colunas** vão entre colchetes, com o nome que aparece no construtor: `[minutos_espera]`. Nome com espaço também: `[Nome do setor]`.
* **Textos** vão entre aspas: `"PS"` ou `'PS'`.
* **Números** usam ponto como separador decimal: `0.9`, e não `0,9`.
* **Verdadeiro e falso** se escrevem `True` e `False`.
* **Funções** se escrevem com os argumentos entre parênteses, separados por vírgula: `round([minutos_espera] / 60)`. O nome não diferencia maiúsculas: `countif` é o mesmo que `CountIf`.

Para filtrar por período, prefira o filtro de coluna do passo **Filtrar**, ou a função `interval` para janelas como "os últimos 30 dias".

## Operadores

| Operador | O que faz | Exemplo |
| - | - | - |
| `+` `-` `*` `/` | Contas. Os parênteses definem a ordem. | `([valor] - [desconto]) * 1.1` |
| `=` `!=` | Igual e diferente. `<>` também vale como diferente. | `[setor] != "PS"` |
| `>` `>=` `<` `<=` | Maior e menor, para números, datas e textos. | `[minutos_espera] >= 30` |
| `AND` `OR` `NOT` | Juntam ou invertem condições. | `[setor] = "PS" AND NOT isNull([alta])` |

* **A divisão devolve decimal.** `3 / 2` dá `1.5`. Dividir por zero dá vazio, e não erro.
* **`AND` vem antes de `OR`.** `[a] OR [b] AND [c]` é `[a] OR ([b] AND [c])`. Na dúvida, use parênteses.
* **Datas aceitam `+` e `-` com uma duração:** `[chegada] + timeSpan(3, "day")`. Data menos data não dá número: para o tempo entre duas datas, use [datetimeDiff](/expressoes/funcoes/datetimediff).

## Valores vazios

Uma comparação com um valor vazio não dá verdadeiro nem falso: dá vazio. Na prática, a linha não passa no filtro e não entra na contagem.

* `[convenio] != "SUS"` deixa de fora as linhas **sem** convênio. Para incluí-las: `[convenio] != "SUS" OR isNull([convenio])`.
* Para testar se há valor, use `isNull` e `notNull`, ou `isEmpty` e `notEmpty`, que também tratam o texto em branco `""` como vazio.
* Para trocar o vazio por um valor, use `coalesce([convenio], "sem convênio")`.

## O editor ajuda enquanto você digita

* Comece a digitar o nome de uma função e o editor sugere as que cabem naquele campo. Aceitar uma sugestão (**Enter** ou **Tab**) escreve a função com os argumentos para preencher; **Tab** passa ao próximo.
* Digite `[` e o editor lista as colunas disponíveis.
* Dentro de uma função, o editor mostra a assinatura com o argumento atual destacado, a descrição e um exemplo.
* O botão **ƒ** ao lado do campo abre todas as funções, por categoria, com busca.
* Um erro fica sublinhado no ponto em que está, com a explicação embaixo do campo. Enquanto houver erro, a consulta continua com a última versão válida da expressão.

## Receitas

### Taxa de internação

A fração dos atendimentos que viraram internação, supondo uma coluna `[codigo_internacao]` preenchida só nesses casos. Uma métrica em **Resumir**:

```text theme={null}
CountIf(notEmpty([codigo_internacao])) / Count()
```

O resultado é uma fração, como `0.18`. Para ver **18%**, escolha **Percentual (× 100)** em **Visualização → Formato**.

### O mesmo indicador no ano anterior

Uma segunda métrica, ao lado da primeira:

```text theme={null}
SamePeriodLastYear(CountIf(notEmpty([codigo_internacao])) / Count(), [chegada])
```

O filtro de data do painel vale para as duas: de 15/01 a 15/03/2026, a segunda conta de 15/01 a 15/03/2025. Veja [SamePeriodLastYear](/expressoes/funcoes/sameperiodlastyear).

### Faixas de espera

Uma coluna personalizada, para agrupar por ela depois:

```text theme={null}
case([minutos_espera] > 60, "mais de 1 h", [minutos_espera] > 30, "30 a 60 min", "até 30 min")
```

### Tempo de espera a partir de duas datas

Uma coluna personalizada, em minutos:

```text theme={null}
datetimeDiff([chegada], [inicio_atendimento], "minute")
```

### Atendimentos com espera longa no pronto-socorro

Um filtro por expressão:

```text theme={null}
[setor] = "PS" AND [minutos_espera] > 30
```

## Mensagens de erro comuns

| Mensagem | O que fazer |
| - | - |
| `Função desconhecida: "setor". Nome de coluna vai entre colchetes: [setor].` | Coluna vai entre colchetes: `[setor]`. |
| `A coluna [setor] não existe aqui.` | Confira o nome no construtor. Uma coluna personalizada só enxerga as que vêm da tabela, das junções e das colunas criadas antes dela. |
| `"Sum" é agregação e só cabe em "Resumir".` | Leve a conta para uma métrica de **Resumir**. Numa coluna ou num filtro, a expressão trabalha linha a linha. |
| `Um filtro precisa dar verdadeiro ou falso, como [espera] > 30.` | Compare o valor com alguma coisa: `[minutos_espera] > 30`, e não só `[minutos_espera]`. |
| `Um resumo precisa de uma agregação: Sum, Count, Average, CountIf…` | Uma métrica resume linhas: envolva a conta numa agregação, como `Sum([valor])`. |
| `Data menos data não dá número.` | Use `datetimeDiff`, que a própria mensagem sugere, com a unidade que você quer. |
| `O argumento 3 de "datetimeAdd" precisa ser um valor escrito, não uma coluna ou conta.` | A unidade, o percentil e o deslocamento são escritos na fórmula: `"day"`, `0.9`, `-1`. |
| `"CountIf" recebe 1 argumento(s), e recebeu 2.` | Confira as vírgulas. Para juntar condições, use `AND` ou `OR`, e não vírgula. |

## Próximos passos

<CardGroup cols={2}>
  <Card title="Lista de funções" icon="list" href="/expressoes/funcoes">
    Todas as funções, por categoria, com sintaxe e exemplo.
  </Card>

  <Card title="SamePeriodLastYear" icon="calendar" href="/expressoes/funcoes/sameperiodlastyear">
    O indicador contra o mesmo período do ano anterior.
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.