Análisis de datos

Sintaxis QUERY en Google Sheets: referencia para FP&A

ModelMonkey16 de mayo de 20269 min de lectura

Este artículo cubre cada cláusula que vas a usar en un modelo financiero real, con fórmulas que cruzan entre pestañas.

Estructura básica de la sintaxis QUERY

=QUERY(datos, "SELECT col [WHERE condición] [GROUP BY col] [ORDER BY col] [LIMIT n] [LABEL col 'nombre'] [FORMAT col 'patrón']", encabezados)

Según la documentación oficial de la función QUERY de Google (support.google.com/docs, verificada en mayo de 2026), las cláusulas soportadas y su orden obligatorio son: SELECT, WHERE, GROUP BY, PIVOT, ORDER BY, LIMIT, OFFSET, LABEL y FORMAT. No puedes reordenarlas. Si pones WHERE después de GROUP BY, obtienes un error de parseo.

Las columnas se referencian por letra (Col1, Col2, etc.), no por nombre de encabezado. Eso es lo primero que sorprende a quienes vienen de SQL.

=QUERY('Datos Brutos'!A:F,
  "SELECT Col1, Col2, SUM(Col4)
   WHERE Col3 = 'México'
   GROUP BY Col1, Col2
   ORDER BY SUM(Col4) DESC",
  1)

El 1 al final le indica a QUERY que trate la primera fila como encabezado. Usa 0 si tu rango no tiene encabezados, y -1 para detección automática.

Cláusula WHERE: reglas fundamentales de sintaxis QUERY

WHERE es donde se originan la mayoría de los errores de sintaxis. Las reglas:

Cadenas de texto requieren comillas simples dentro de la cadena de consulta entre comillas dobles:

WHERE Col2 = 'Colombia'

Números no llevan comillas:

WHERE Col4 > 250000

Fechas requieren la palabra clave date:

WHERE Col1 >= date '2026-01-01'

Referencias a celdas no pueden ir dentro del literal de cadena: se concatenan por fuera:

=QUERY('P&L'!A:E,
  "SELECT Col1, Col3, Col4
   WHERE Col2 = '" & Supuestos!$B$5 & "'
   AND Col4 > " & Supuestos!$C$3,
  1)

Así es como conectas una QUERY a tu pestaña de supuestos. El filtro de región en $B$5 y el piso de ingresos en $C$3 impulsan cada resultado de forma dinámica. Cambias una celda y toda la consulta se recalcula.

Manejo de nulos: QUERY descarta filas con valores nulos en columnas agrupadas por defecto. Si estás agregando datos de headcount con celdas vacías, envuelve con IFERROR o pre-llena los blancos con "".

Sintaxis QUERY para modelos financieros con múltiples pestañas

Las fórmulas QUERY en una sola pestaña sirven para demos. Los modelos reales cruzan entre hojas.

Margen de contribución por línea de producto, jalando desde una pestaña de transacciones:

=QUERY('Transacciones'!A:H,
  "SELECT Col3, SUM(Col5), SUM(Col6), SUM(Col5)-SUM(Col6)
   WHERE Col8 = 'Q1 2026'
   AND Col2 != 'Intercompañía'
   GROUP BY Col3
   ORDER BY SUM(Col5)-SUM(Col6) DESC
   LABEL Col3 'Línea de Producto', SUM(Col5) 'Ingresos', SUM(Col6) 'COGS', SUM(Col5)-SUM(Col6) 'Utilidad Bruta'",
  1)

Esta fórmula muestra el margen de contribución por SKU desde 4,200 filas de datos de transacciones, sin tabla dinámica ni columnas auxiliares.

Pull de headcount rodante para sensibilidad 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 tiene el filtro de área. Dashboard!$B$3 tiene la fecha de inicio. Cambia cualquiera de los dos y la proyección de runway se recalcula al instante en un modelo con 12 entidades.

Sintaxis GROUP BY, PIVOT y agregaciones en QUERY

GROUP BY exige que toda columna no agregada en SELECT aparezca también en GROUP BY. Es comportamiento estándar de SQL, pero QUERY lanza Invalid query: Column [X] is not in grouping sin mayor explicación.

PIVOT es la cláusula que la mayoría de los analistas desconoce. Transpone un resultado de GROUP BY en una tabla cruzada:

=QUERY('P&L'!A:E,
  "SELECT Col1, SUM(Col4)
   WHERE Col3 != 'Intercompañía'
   GROUP BY Col1
   PIVOT Col2",
  1)

Si Col2 es el trimestre (Q1, Q2, Q3, Q4), esto produce ingresos por entidad x trimestre en una sola fórmula. Sin columnas auxiliares, sin actualización manual de tabla dinámica. Los encabezados de columna son dinámicos: agrega datos de Q5 a la fuente y el pivot crece automáticamente.

Agregaciones soportadas según la Referencia del lenguaje de consulta GViz (developers.google.com/chart/interactive/docs/querylanguage, versión de mayo de 2026): SUM, AVG, COUNT, MAX, MIN. No existe MEDIAN ni STDEV. Para esas, necesitas fórmulas de array envolviendo el resultado de QUERY.

LABEL y FORMAT: cómo limpiar el output de QUERY para reportes ejecutivos

El output crudo de QUERY usa letras de columna como encabezados (SUM(Col4) literalmente). Para un reporte trimestral de directorio necesitas etiquetas legibles y números formateados.

=QUERY('Ingresos'!A:F,
  "SELECT Col1, SUM(Col4), AVG(Col4), MAX(Col4)
   WHERE Col2 = 'Recurrente'
   AND Col3 >= date '2026-01-01'
   GROUP BY Col1
   ORDER BY SUM(Col4) DESC
   LABEL Col1 'Segmento', SUM(Col4) 'ARR Total', AVG(Col4) 'Deal Promedio', MAX(Col4) 'Deal Mayor'
   FORMAT SUM(Col4) '$#,##0', AVG(Col4) '$#,##0', MAX(Col4) '$#,##0'",
  1)

FORMAT acepta cadenas de formato de número estándar de Google Sheets. $#,##0 para montos en dólares enteros, $#,##0.00 para centavos, #,##0.0% para porcentajes. El formateo es solo visual: el valor numérico subyacente se mantiene intacto, así que los SUMIFS posteriores sobre este output siguen funcionando.

Un punto importante: FORMAT aplica al renderizado de la celda de output de QUERY, no al formato de la celda en sí. Si alguien copia el output a otra hoja, el formato desaparece. Para un reporte de directorio, pega como valores antes de compartirlo.

Sintaxis QUERY vs. SUMIFS: cuándo usar cada una

Las dos pueden agregar datos entre pestañas. La decisión depende de lo que estás construyendo.

EscenarioQUERYSUMIFS
Un solo valor agregadoExageradaMejor opción
Tabla de múltiples columnasMejor opciónIncómoda
Agrupación dinámica / PIVOTÚnica opciónNo es posible
Cruce entre pestañas con rangos nombradosRequiere concatenación=SUMIFS('P&L'!C:C,'P&L'!B:B,">="&Supuestos!$B$3)
Usada por otras fórmulas aguas abajoRiesgosa (el output se desplaza)Referencia estable
Fuente de datos con más de 50,000 filasMás lentaMás rápida

SUMIFS gana cuando necesitas un número en una celda específica de la que dependen otras fórmulas. QUERY gana cuando necesitas una tabla formateada para reportes. Combinarlas, SUMIFS para la lógica del modelo y QUERY para la visualización del output, suele ser la decisión correcta.

Errores comunes de sintaxis en QUERY y qué significan

PARSE_ERROR: Generalmente una cláusula fuera de orden, o una cadena de texto a la que le falta la comilla simple de cierre. Verifica que tu concatenación cierre cada '.

Invalid query: Column [ColN] is in SELECT but not in GROUP BY: Agregaste algunas columnas pero olvidaste incluir una columna no agregada en GROUP BY.

Invalid query: Unable to parse date string: Tu concatenación de fecha no está produciendo el formato yyyy-mm-dd. Envuelve con TEXT(celda_fecha,"yyyy-mm-dd").

#N/A sin mensaje de error: La consulta devolvió 0 filas. Generalmente es un filtro que no coincide con nada. Revisa los valores de texto: QUERY distingue entre mayúsculas y minúsculas. 'México' y 'méxico' son valores distintos.

#VALUE!: Tipos de datos mixtos en la columna fuente. Una columna que QUERY interpreta como numérica, pero que contiene aunque sea una celda con texto, rompe las comparaciones numéricas. Limpia la fuente o usa filtros con ISNUMBER.

Preguntas frecuentes sobre la sintaxis QUERY en Google Sheets

¿Puedo usar el nombre del encabezado de columna en lugar de Col1, Col2? No directamente. QUERY siempre usa notación posicional. Si tu rango empieza en la columna A, esa es Col1; la columna B es Col2, y así sucesivamente. El argumento encabezados solo le dice a QUERY cuántas filas tratar como encabezado, no habilita referencias por nombre.

¿Por qué mi fecha en WHERE no funciona aunque el formato se ve correcto? El formato que QUERY espera es estrictamente date 'yyyy-mm-dd'. Si concatenas una fecha desde una celda, usa TEXT(celda,"yyyy-mm-dd") para garantizar el formato. Cualquier otra representación, incluyendo dd/mm/yyyy o formatos locales, genera Unable to parse date string.

¿QUERY puede cruzar datos entre dos rangos distintos, como un JOIN en SQL? No de forma nativa. QUERY opera sobre un único rango de datos. Si necesitas empatar IDs de transacciones contra una tabla de referencia, debes consolidar los datos previamente en una pestaña auxiliar, o usar el panel lateral de ModelMonkey, que ejecuta SQL real sobre los rangos de tu hoja mediante un motor DuckDB integrado y soporta joins, funciones de ventana y agregaciones que QUERY no tiene.

¿Cuándo debo usar QUERY y cuándo SUMIFS? Usa SUMIFS cuando necesitas un único valor en una celda específica de la que dependen otras fórmulas aguas abajo: su referencia es estable y predecible. Usa QUERY cuando necesitas producir una tabla completa para un reporte o dashboard: es más compacta y soporta agrupaciones dinámicas con PIVOT. La combinación de ambas es lo más común en modelos financieros maduros.

¿La sintaxis QUERY de Google Sheets funciona igual en todas las configuraciones de idioma de la cuenta? Las palabras clave de la consulta (SELECT, WHERE, GROUP BY, etc.) siempre van en inglés, independientemente del idioma de tu cuenta o de tu región. Lo que puede variar es el separador de argumentos de fórmula: en cuentas configuradas con punto y coma como separador, la fórmula sería =QUERY(datos; "consulta"; 1) en lugar de coma.

Rangos nombrados y rendimiento de QUERY

A partir de mayo de 2026, los rangos nombrados funcionan como argumento datos en QUERY:

=QUERY(LedgerTransacciones,
  "SELECT Col1, Col2, SUM(Col5)
   WHERE Col3 = 'Reales'
   GROUP BY Col1, Col2",
  1)

Esto hace que las fórmulas sean más legibles y desacopla la consulta de la estructura física de pestañas. Si reorganizas las hojas, actualizas la definición del rango nombrado y cada QUERY que lo referencia se actualiza automáticamente.

El rendimiento se degrada notablemente en rangos de más de 50,000 filas. QUERY se recalcula con cada edición en cualquier celda del rango fuente. Para logs de transacciones grandes, filtra primero a un rango de trabajo más pequeño usando una pestaña auxiliar y luego ejecuta QUERY contra esa. La diferencia en tiempo de recálculo puede ser de 10 veces.

En resumen

La sintaxis de QUERY en Google Sheets te da reportes estilo SQL sin salir de Sheets: el orden de las cláusulas es fijo (SELECT - WHERE - GROUP BY - PIVOT - ORDER BY - LABEL - FORMAT), las referencias de columnas usan notación posicional (Col1, Col2), y las referencias a celdas se concatenan fuera de la cadena de consulta. Úsala para tablas de output y presentaciones ejecutivas. Conserva SUMIFS para la lógica del modelo de la que dependen otras fórmulas.