Este artigo cobre todas as cláusulas que você vai usar de fato em um modelo financeiro, com fórmulas que cruzam abas.
A Estrutura Básica da Sintaxe QUERY
=QUERY(dados, "SELECT col [WHERE condição] [GROUP BY col] [ORDER BY col] [LIMIT n] [LABEL col 'nome'] [FORMAT col 'padrão']", cabeçalhos)
De acordo com a documentação oficial da função QUERY do Google (support.google.com/docs, verificada em maio de 2026), as cláusulas suportadas, na ordem correta, são: SELECT, WHERE, GROUP BY, PIVOT, ORDER BY, LIMIT, OFFSET, LABEL e FORMAT. Não é possível reordená-las. Coloque WHERE antes de GROUP BY ou você receberá um erro de parse.
As colunas são referenciadas por posição - Col1, Col2 etc. - e não pelo nome do cabeçalho. Esse é o primeiro ponto que surpreende quem vem do SQL.
=QUERY('Dados Brutos'!A:F,
"SELECT Col1, Col2, SUM(Col4)
WHERE Col3 = 'Sudeste'
GROUP BY Col1, Col2
ORDER BY SUM(Col4) DESC",
1)
O 1 no final instrui o QUERY a tratar a primeira linha como cabeçalho. Use 0 se o intervalo não tiver cabeçalhos, ou -1 para detecção automática.
Cláusula WHERE: Regras Essenciais da Sintaxe QUERY
O WHERE é onde a maioria dos erros de sintaxe se origina. As regras:
Strings exigem aspas simples dentro da string de consulta (que já usa aspas duplas):
WHERE Col2 = 'Sul'
Números não precisam de aspas:
WHERE Col4 > 250000
Datas exigem a palavra-chave date:
WHERE Col1 >= date '2026-01-01'
Referências de células não podem entrar dentro da string literal - você as concatena por fora:
=QUERY('DRE'!A:E,
"SELECT Col1, Col3, Col4
WHERE Col2 = '" & Premissas!$B$5 & "'
AND Col4 > " & Premissas!$C$3,
1)
É assim que você conecta um QUERY à sua aba de premissas. O filtro de região em $B$5 e o piso de receita em $C$3 alimentam todas as saídas de forma dinâmica. Altere uma célula e a consulta inteira roda novamente.
Tratamento de nulos: por padrão, o QUERY descarta linhas com valores nulos em colunas agrupadas. Se você estiver agregando dados de headcount com lacunas, envolva com IFERROR ou preencha os campos vazios com "".
Sintaxe QUERY para Modelos Financeiros com Múltiplas Abas
Fórmulas QUERY em uma única aba funcionam bem em demonstrações. Modelos reais cruzam planilhas.
Margem de contribuição por linha de produto, extraindo de uma aba de transações:
=QUERY('Transações'!A:H,
"SELECT Col3, SUM(Col5), SUM(Col6), SUM(Col5)-SUM(Col6)
WHERE Col8 = 'T1 2026'
AND Col2 != 'Intercompanhia'
GROUP BY Col3
ORDER BY SUM(Col5)-SUM(Col6) DESC
LABEL Col3 'Linha de Produto', SUM(Col5) 'Receita', SUM(Col6) 'CMV', SUM(Col5)-SUM(Col6) 'Lucro Bruto'",
1)
Isso extrai a margem de contribuição por SKU a partir de 4.200 linhas de dados de transação, sem tabela dinâmica ou coluna auxiliar.
Extração de headcount para análise de sensibilidade de runway:
=QUERY(Headcount!$A:$G,
"SELECT Col2, Col3, SUM(Col5)
WHERE Col6 = '" & Dashboard!$B$2 & "'
AND Col4 >= date '" & TEXT(Dashboard!$B$3,"yyyy-mm-dd") & "'
GROUP BY Col2, Col3
ORDER BY Col2",
1)
Dashboard!$B$2 armazena o filtro de departamento. Dashboard!$B$3 armazena a data de início. Altere qualquer um dos dois e a projeção de runway recalcula instantaneamente em um modelo com 12 entidades.
Sintaxe QUERY para GROUP BY, PIVOT e Agregações
O GROUP BY exige que toda coluna não agregada no SELECT apareça também no GROUP BY. É o comportamento padrão do SQL, mas o QUERY vai lançar Invalid query: Column [X] is not in grouping sem nenhuma explicação adicional.
O PIVOT é a cláusula que a maioria dos analistas não conhece. Ela transpõe um resultado de GROUP BY em uma tabela cruzada:
=QUERY('DRE'!A:E,
"SELECT Col1, SUM(Col4)
WHERE Col3 != 'Intercompanhia'
GROUP BY Col1
PIVOT Col2",
1)
Se Col2 for o trimestre (T1, T2, T3, T4), isso produz receita por entidade x trimestre em uma única fórmula. Sem colunas auxiliares, sem atualização manual de tabela dinâmica. Os cabeçalhos de coluna são dinâmicos: adicione dados do T5 na fonte e o PIVOT cresce automaticamente.
Agregações suportadas segundo o GViz Query Language Reference (developers.google.com/chart/interactive/docs/querylanguage, versão de maio de 2026): SUM, AVG, COUNT, MAX, MIN. Não existem MEDIAN nem STDEV - para isso você precisa de fórmulas matriciais em torno da saída do QUERY.
LABEL e FORMAT: Preparando a Saída do QUERY para Apresentações ao Conselho
A saída bruta do QUERY usa as referências de coluna como cabeçalhos (SUM(Col4) literalmente). Para uma apresentação trimestral ao conselho você precisa de rótulos legíveis e números formatados.
=QUERY('Receita'!A:F,
"SELECT Col1, SUM(Col4), AVG(Col4), MAX(Col4)
WHERE Col2 = 'Recorrente'
AND Col3 >= date '2026-01-01'
GROUP BY Col1
ORDER BY SUM(Col4) DESC
LABEL Col1 'Segmento', SUM(Col4) 'ARR Total', AVG(Col4) 'Ticket Médio', MAX(Col4) 'Maior Contrato'
FORMAT SUM(Col4) '#.##0', AVG(Col4) '#.##0', MAX(Col4) '#.##0'",
1)
O FORMAT aceita strings de formato de número padrão do Google Sheets. #.##0 para valores inteiros, #.##0,00 para decimais, #.##0,0% para percentuais. A formatação é apenas visual: o valor numérico subjacente da célula permanece intacto, então SUMIFS aplicados sobre essa saída continuam funcionando normalmente.
Um ponto de atenção: o FORMAT se aplica à renderização da célula de saída do QUERY, não ao formato da célula em si. Se alguém copiar a saída para outra planilha, a formatação é perdida. Para apresentações ao conselho, cole como valores antes de enviar.
Sintaxe QUERY vs. SUMIFS: Quando Usar Cada Um
Ambos conseguem agregar dados entre abas. A escolha depende do que você está construindo.
| Cenário | QUERY | SUMIFS |
|---|---|---|
| Um único valor agregado | Excessivo | Melhor |
| Tabela de saída com múltiplas colunas | Melhor | Trabalhoso |
| Agrupamento dinâmico / PIVOT | Única opção | Não é possível |
| Referência cruzada com intervalos nomeados | Requer concatenação | =SUMIFS('DRE'!C:C,'DRE'!B:B,">="&Premissas!$B$3) |
| Usado como entrada de outras fórmulas | Arriscado (saída pode deslocar) | Referência estável |
| Fonte com mais de 50.000 linhas | Mais lento | Mais rápido |
O SUMIFS vence quando você precisa de um número em uma célula específica da qual outras fórmulas dependem. O QUERY vence quando você precisa de uma tabela formatada para relatórios. Combiná-los - SUMIFS para a lógica do modelo e QUERY para a exibição de saída - costuma ser a escolha certa.
Erros Comuns de Sintaxe QUERY e o Que Significam
PARSE_ERROR - Normalmente indica uma cláusula fora de ordem ou uma string sem a aspa simples de fechamento. Verifique se a concatenação fecha todos os '.
Invalid query: Column [ColN] is in SELECT but not in GROUP BY - Você agregou algumas colunas mas esqueceu de incluir uma coluna não agregada no GROUP BY.
Invalid query: Unable to parse date string - Sua concatenação de data não está gerando o formato yyyy-mm-dd. Envolva com TEXT(célula_data,"yyyy-mm-dd").
#N/A sem mensagem de erro - A consulta retornou 0 linhas. Geralmente é um filtro que não encontra correspondência. Verifique os valores de string: o QUERY diferencia maiúsculas de minúsculas. 'Sudeste' e 'sudeste' são valores diferentes.
#VALUE! - Tipos de dados misturados na coluna de origem. Uma coluna que o QUERY interpreta como numérica, mas que contém mesmo uma única célula com texto, vai quebrar comparações numéricas. Limpe a fonte ou use filtros com ISNUMBER.
Intervalos Nomeados e Performance do QUERY
A partir de maio de 2026, intervalos nomeados funcionam como argumento dados no QUERY:
=QUERY(LancamentosGerais,
"SELECT Col1, Col2, SUM(Col5)
WHERE Col3 = 'Realizado'
GROUP BY Col1, Col2",
1)
Isso torna as fórmulas mais legíveis e desacopla a consulta da estrutura física das abas. Se você reorganizar as abas, basta atualizar a definição do intervalo nomeado e todos os QUERYs que o referenciam se atualizam automaticamente.
A performance cai de forma perceptível em intervalos acima de 50.000 linhas. O QUERY recalcula a cada edição em qualquer célula do intervalo de origem. Para logs de lançamentos extensos, filtre para um intervalo de trabalho menor em uma aba auxiliar e execute o QUERY sobre esse intervalo. A diferença no tempo de recálculo pode chegar a 10x.
Se você precisar cruzar dados de dois intervalos - como associar IDs de transação a uma tabela de referência - o QUERY não faz isso nativamente. Você precisa mesclar os dados antes ou usar o painel lateral do ModelMonkey, que executa SQL real sobre os intervalos da sua planilha por meio de um motor DuckDB embutido, com suporte a joins, window functions e agregações que o QUERY não oferece.
Perguntas Frequentes sobre a Sintaxe QUERY do Google Sheets
Posso usar o nome do cabeçalho da coluna em vez de Col1, Col2?
Não diretamente. O QUERY referencia colunas pela posição no intervalo de dados, não pelo rótulo do cabeçalho. Se Col1 for "Data" e Col2 for "Região", você ainda escreve WHERE Col2 = 'Sul' na string de consulta. Isso significa que reorganizar colunas na aba de origem quebra todas as fórmulas QUERY que a referenciam - uma boa razão para travar a estrutura da aba de dados brutos.
Por que meu QUERY retorna #N/A mesmo com dados na aba de origem?
Quase sempre é um filtro WHERE que não encontra correspondência. O QUERY diferencia maiúsculas de minúsculas: 'São Paulo' e 'são paulo' são valores distintos. Verifique também espaços extras nos dados de origem - um espaço em branco invisível após o valor de texto faz a comparação falhar silenciosamente.
Como filtrar por um período de datas dinâmico, como "mês atual"?
Concatene as datas calculadas fora da string de consulta usando TEXT. Por exemplo, para filtrar pelo mês corrente:
=QUERY('Transações'!A:F,
"SELECT Col1, SUM(Col4)
WHERE Col2 >= date '" & TEXT(EOMONTH(TODAY(),-1)+1,"yyyy-mm-dd") & "'
AND Col2 <= date '" & TEXT(EOMONTH(TODAY(),0),"yyyy-mm-dd") & "'
GROUP BY Col1",
1)
EOMONTH(TODAY(),-1)+1 retorna o primeiro dia do mês atual e EOMONTH(TODAY(),0) retorna o último.
O QUERY funciona com dados de outra planilha do Google (arquivo diferente)?
Não diretamente. O argumento dados precisa referenciar um intervalo no mesmo arquivo. Para dados de outro arquivo, use IMPORTRANGE para trazer o intervalo para uma aba de staging e depois aplique o QUERY sobre esse resultado. Atenção: essa combinação pode ser lenta em volumes grandes.
Qual é a diferença entre QUERY e FILTER no Google Sheets?
O FILTER retorna linhas que atendem a uma condição, mas não agrega, agrupa nem formata. O QUERY faz tudo isso. Use FILTER quando quiser extrair linhas individuais sem transformação; use QUERY quando precisar agregar, pivotar ou formatar a saída para um relatório.
Resumo
A sintaxe QUERY do Google Sheets oferece relatórios no estilo SQL sem sair da planilha: a ordem das cláusulas é fixa (SELECT -> WHERE -> GROUP BY -> PIVOT -> ORDER BY -> LABEL -> FORMAT), as referências de colunas usam notação posicional (Col1, Col2) e as referências de células são concatenadas fora da string de consulta. Use o QUERY para tabelas de saída e apresentações ao conselho; mantenha o SUMIFS para a lógica do modelo da qual outras fórmulas dependem.