Análise de dados

QUERY ORDER BY no Google Sheets: ordenar sem quebrar links

ModelMonkey8 de junho de 20268 min de leitura

Estrutura básica:

=QUERY('DRE'!A:F, "SELECT A, B, C, D ORDER BY D DESC", 1)

O terceiro argumento (1) indica a quantidade de linhas de cabeçalho. As letras de coluna (A, B, D) se referem às colunas reais da planilha na aba de origem, não às posições dentro do intervalo. A sintaxe segue a Google Visualization API Query Language, documentada pelo Google e estável desde 2012.

Por que ORDER BY é melhor do que ordenar manualmente

Quando você usa Dados -> Ordenar intervalo em uma aba de origem, as linhas mudam fisicamente de posição. Qualquer fórmula em outra aba que referencia 'DRE'!C14 passa a apontar para a entidade errada. Em um modelo com oito abas - DRE, Balanço Patrimonial, Fluxo de Caixa, FCFF, Premissas, Retornos, Sensibilidade, Output - uma ordenação descuidada propaga dezenas de referências quebradas.

QUERY ORDER BY escreve um array ordenado em um intervalo de exibição separado. A origem permanece intacta. Você pode entregar o board pack a um CFO que ordena por instinto sem se preocupar se os dados de origem foram alterados.

A partir de 2026, o comportamento da cláusula ORDER BY dentro do QUERY do Google Sheets é idêntico nas versões desktop e mobile, o que elimina a inconsistência que afetava versões anteriores ao acessar a planilha pelo aplicativo.

Sintaxe: crescente, decrescente e múltiplas colunas

O padrão é crescente. Em finanças, quase sempre você quer decrescente, do maior para o menor:

=QUERY('Receita'!A:E, "SELECT A, B, E ORDER BY E DESC", 1)

A ordenação por múltiplas colunas funciona exatamente como em SQL, com chaves encadeadas:

=QUERY('Pipeline'!A:G,
  "SELECT A, B, C, D ORDER BY C DESC, D ASC", 1)

Ordena por ARR decrescente e depois por data de fechamento crescente como critério de desempate. Para um pipeline de captação ou M&A com mais de 40 deals, isso ranqueia por tamanho de deal mantendo deals de mesmo valor em ordem cronológica.

QUERY entre abas: o erro clássico com referências de coluna

Para um intervalo contíguo de uma única aba, as letras de coluna funcionam normalmente:

=QUERY('FCFF'!A:H, "SELECT A, B, G, H ORDER BY G DESC", 1)

Mas quando você monta um array literal com colunas não contíguas ou com múltiplas abas, o QUERY perde o rastreamento das letras de coluna originais. A solução é usar a notação posicional Col1, Col2:

// Isso falha
=QUERY({'DRE'!C:C, 'DRE'!F:F}, "SELECT C, F ORDER BY F DESC", 1)

// Isso funciona
=QUERY({'DRE'!C:C, 'DRE'!F:F}, "SELECT Col1, Col2 ORDER BY Col2 DESC", 1)

Essa distinção está documentada na referência da Visualization API Query Language do Google, mas fica enterrada na documentação. A maioria dos analistas tropeça nesse erro pelo menos uma vez ao montar uma visão consolidada com múltiplas fontes. O suporte oficial do Google Workspace também documenta o comportamento de arrays literais na página de ajuda da função QUERY, com exemplos de Col1/Col2 que confirmam a notação correta.

Para empilhar linhas de várias abas (padrão de consolidação trimestral):

=QUERY({'Jan'!A:E; 'Fev'!A:E; 'Mar'!A:E},
  "SELECT Col1, Col2, Col5 ORDER BY Col5 DESC", 1)

Ponto e vírgula empilha linhas. Vírgula empilha colunas.

WHERE + ORDER BY juntos

Na prática, você vai querer os dois. Filtre primeiro, depois ordene o resultado filtrado:

=QUERY('Dados SKU'!A:F,
  "SELECT A, B, D, F WHERE F > 0.35 ORDER BY F DESC",
  1)

Isso traz os SKUs em que a margem de contribuição (coluna F) supera 35% e os ranqueia de forma decrescente. Para um slide de margem de contribuição por SKU no board pack, essa é a fórmula completa, sem colunas auxiliares nem etapa de filtro manual.

Com um parâmetro de data dinâmico vindo de uma aba de Premissas:

=QUERY('Transações'!A:E,
  "SELECT A, B, C, E WHERE B >= date '"&TEXT(Premissas!$B$3,"yyyy-mm-dd")&"' ORDER BY E DESC",
  1)

O TEXT() converte a célula de premissa para o formato yyyy-mm-dd que o QUERY espera. Sem ele, a comparação de datas passa todas as linhas ou nenhuma, dependendo do tipo de dado. Sem erro, só dado errado: o pior tipo de bug em um modelo financeiro.

Ordenar por uma coluna que não aparece no output

O QUERY ORDER BY permite ordenar por uma coluna sem incluí-la no resultado. O SORT() não consegue fazer isso de forma limpa.

=QUERY('Headcount'!A:G,
  "SELECT A, B, C ORDER BY G DESC",
  1)

O output mostra nome, departamento e faixa salarial (colunas A-C). As linhas se ordenam pela data de admissão (coluna G) sem exibir o G. Para uma visão de headcount apresentada ao conselho em que você quer os contratados mais recentes no topo mas não quer datas poluindo o slide, esse é o padrão correto.

Sensibilidade de runway: um exemplo real

Para uma análise de sensibilidade de novas contratações, você quer os candidatos planejados ranqueados pelo custo mensal em caixa. Assim, se o runway cair abaixo de 18 meses, o CFO consegue ler a lista de cortes de cima para baixo:

=QUERY('Headcount'!A:J,
  "SELECT A, C, D, J WHERE D = 'Planejado' ORDER BY J DESC",
  1)

A coluna J é o custo mensal total (salário mais encargos). Em uma empresa com ARR de R$ 21 milhões queimando R$ 1,9 milhão por mês, saber que três contratações planejadas na engenharia representam R$ 260 mil por mês em custo incremental, e vê-las ranqueadas, é exatamente o tipo de análise que gera decisão. O output ordenado de uma aba de headcount ao vivo garante que o CFO sempre veja dados atualizados, não um snapshot desatualizado.

QUERY ORDER BY vs. SORT()

QUERY ORDER BYSORT()
Filtrar ao ordenarSim (WHERE)Precisa de FILTER
Ordenação por múltiplas colunasSimSim
Seleção de colunasSim (SELECT)Não
Tratamento de cabeçalhoTerceiro argumentoExclusão manual
Fonte com array literalSintaxe Col1, Col2Mais simples
AgregaçãoSim (GROUP BY, SUM)Não

Para "ordenar este intervalo contíguo pela coluna 3", o SORT() é mais curto. Para qualquer combinação de filtro, seleção e ordenação na mesma operação, que representa a maior parte do trabalho em board packs, o QUERY resolve em uma única fórmula.

Depurando erros comuns

Ordenação errada sem erro aparente: a coluna contém números armazenados como texto. O QUERY ordena texto de forma lexicográfica, então "100" vem antes de "20". Envolva a coluna de origem com VALUE() ou verifique o alinhamento: números reais ficam alinhados à direita, números em formato de texto ficam à esquerda.

#VALUE! em intervalo entre abas: você usou letras de coluna dentro de um array literal {}. Troque para Col1, Col2.

Filtro de data retornando todas as linhas ou nenhuma: envolva a referência de célula com TEXT(célula, "yyyy-mm-dd") como mostrado acima.

Ordenação completamente ignorada: você tem ORDER BY depois de GROUP BY ou PIVOT. Essas cláusulas entram em conflito em certas configurações. Agrupe primeiro e envolva o resultado agrupado em um segundo QUERY para ordenar.

Perguntas frequentes

Posso usar ORDER BY com LABEL para renomear colunas no output? Sim. A cláusula LABEL vem depois de ORDER BY na string de query. Exemplo: "SELECT A, B, D ORDER BY D DESC LABEL A 'Produto', B 'Região', D 'Receita'". A ordem das cláusulas importa: SELECT, WHERE, GROUP BY, ORDER BY, LIMIT, LABEL.

ORDER BY funciona com datas no formato brasileiro (dd/mm/yyyy)? Não diretamente. O QUERY interpreta datas no formato yyyy-mm-dd. Se a coluna de origem usa formato brasileiro, converta a referência com TEXT() na cláusula WHERE e garanta que a coluna de origem seja do tipo data real, não texto. Colunas de data real armazenadas corretamente no Google Sheets se ordenam sem conversão.

Qual o limite de linhas que o QUERY ORDER BY consegue ordenar de forma confiável? O Google Sheets suporta até 10 milhões de células por planilha. Para conjuntos com mais de 50.000 linhas, o tempo de recálculo do QUERY começa a ser perceptível. Nesses casos, considere filtrar com WHERE antes de ordenar para reduzir o volume processado, ou use o BigQuery integrado ao Sheets via conector nativo.

O que acontece com células em branco na coluna usada para ORDER BY? Valores nulos (células vazias) são tratados como os menores possíveis. Em ORDER BY coluna DESC, linhas em branco aparecem no final. Em ORDER BY coluna ASC, aparecem no início. Não há equivalente ao NULLS LAST do SQL padrão no QUERY do Sheets.

Posso ordenar por uma coluna calculada dentro do próprio QUERY? Não diretamente com ORDER BY. A solução é criar uma coluna auxiliar na aba de origem com o cálculo desejado, e então referenciar essa coluna no ORDER BY. Alternativamente, envolva o QUERY em outro QUERY externo para ordenar pelo resultado calculado.


Se você está construindo essas visões ordenadas como parte de um modelo maior e quer que a sintaxe do QUERY seja gerada a partir de uma descrição simples da lógica de ordenação, como "mostre os SKUs acima de 35% de margem ordenados por receita", o ModelMonkey escreve e atualiza a fórmula direto pelo painel lateral do Google Sheets.