Análisis de datos

cannot group without agg en Google Sheets QUERY

ModelMonkey13 de junio de 20268 min de lectura

Por qué aparece el error

La función QUERY de Google corre sobre el lenguaje de consultas de la Google Visualization API, que sigue reglas estrictas similares a SQL. La documentación es clara: "Cuando se usa GROUP BY, cada columna en la cláusula SELECT debe estar listada en la cláusula GROUP BY o usar una función de agregación."

Sin ambigüedades, sin excepciones. Cada columna es una dimensión (listada en GROUP BY) o una medida (envuelta en un agregado). En el momento en que mezclas esos roles, QUERY se detiene con cannot group without agg.

Un ejemplo concreto. Tienes una pestaña Ingresos con las columnas: Fecha (A), Región (B), SKU (C), Ingresos (D), Costo (E). Quieres los ingresos por región:

=QUERY('Ingresos'!A:E, "SELECT B, C, SUM(D) GROUP BY B", 1)

Esto genera el error porque la columna C (SKU) aparece en SELECT pero no está en GROUP BY ni está agregada. Dos formas válidas de corregirlo:

Opción 1 - Agregar SKU a GROUP BY (devuelve una fila por combinación región-SKU):

=QUERY('Ingresos'!A:E, "SELECT B, C, SUM(D) GROUP BY B, C", 1)

Opción 2 - Eliminar SKU del SELECT (devuelve una fila por región):

=QUERY('Ingresos'!A:E, "SELECT B, SUM(D) GROUP BY B", 1)

Cuál es la corrección correcta depende del resultado que necesitas, no de la sintaxis de QUERY. Si quieres ingresos por región solamente, elimina C. Si quieres ingresos por región y SKU, mantén C y agrégala a GROUP BY.

El patrón de auditoría de columnas

Para una consulta de reporte directivo con 6 o más columnas, audita cada columna del SELECT antes de ejecutar. Este es un ejemplo de cierre de Q2 que agrupa correctamente:

=QUERY(
  'Ingresos'!A:F,
  "SELECT B, SUM(D), SUM(E), SUM(D)-SUM(E)
   WHERE A >= date '2026-04-01' AND A <= date '2026-06-30'
   GROUP BY B
   LABEL SUM(D) 'Ingresos', SUM(E) 'Costo', SUM(D)-SUM(E) 'Margen Bruto'",
  1
)

Región (B) es la dimensión y va en GROUP BY. Ingresos, Costo y Margen Bruto son medidas, y cada una está envuelta en SUM() o expresada como combinación de agregados. La expresión SUM(D)-SUM(E) funciona precisamente porque ambos componentes están agregados. El resultado por grupo es un valor único, que es exactamente lo que QUERY requiere.

QUERY GROUP BY vs. SUMIFS: cuándo usar cada uno

El GROUP BY de QUERY es limpio para agregaciones en una sola pestaña. Para modelos financieros con múltiples pestañas, SUMIFS generalmente gana. Esta es la comparación honesta:

EscenarioQUERY GROUP BYSUMIFS / SUMPRODUCT
Agregación en una sola pestañaSintaxis limpia, similar a SQLMás verboso
Referencias entre pestañasNo soportado nativamenteNativo y confiable
Fecha dinámica desde pestaña SupuestosRequiere concatenación de texto">=" & Supuestos!$B$3
Múltiples condiciones de filtroCláusula WHERECriterios apilados en SUMIFS
Datasets de más de 10,000 filasMás lento al recalcularMás rápido
Conjunto de dimensiones desconocidoDevuelve todas las filas automáticamenteRequiere criterios hardcodeados
Depuración de errores de agrupacióncannot group without agg#VALUE! en rangos incorrectos

Si tu reporte trimestral jala actuals con el rango de fechas en Supuestos!$B$3:$B$4 e ingresos en 'PyG'!C:C, SUMIFS lo resuelve sin los malabares de concatenación de QUERY:

=SUMIFS(
  'PyG'!C:C,
  'PyG'!B:B, ">=" & Supuestos!$B$3,
  'PyG'!B:B, "<=" & Supuestos!$B$4,
  'PyG'!D:D, Devoluciones!$A2
)

QUERY no puede referenciar Supuestos!$B$3 directamente dentro del string de consulta. Tendrías que concatenarlo como texto, lo que falla con formatos de fecha y genera errores que parecen no tener relación con el problema original. SUMIFS acepta la referencia a celda de forma nativa.

Cuándo sí vale la pena usar QUERY GROUP BY

QUERY justifica su uso cuando no conoces de antemano los valores distintos de una dimensión. Si tienes 14 SKUs activos y necesitas el margen de contribución por SKU para un análisis de margen bruto (objetivo de 38.5%, blended actual en 34.1%), QUERY devuelve las 14 filas sin hardcodear ninguna:

=QUERY(
  'Ventas'!A:G,
  "SELECT C, SUM(D), SUM(E), (SUM(D)-SUM(E))/SUM(D)
   GROUP BY C
   ORDER BY (SUM(D)-SUM(E))/SUM(D) DESC
   LABEL C 'SKU', SUM(D) 'Ingresos', SUM(E) 'Costo'",
  1
)

La expresión de margen (SUM(D)-SUM(E))/SUM(D) no dispara el error de agrupación porque cada componente está agregado. Un valor por grupo, siempre. SUMIFS requeriría una fila hardcodeada por SKU, lo que se rompe en el momento en que aparece un SKU nuevo en los datos.

Los casos que no son obvios

Labels: La cláusula LABEL no genera errores de agrupación por sí sola, pero si etiquetas una columna que ya está rota en el SELECT, el mensaje de error se desplaza de tal forma que parece un problema de label. Audita SELECT y GROUP BY antes de tocar LABEL.

COUNT() vs. COUNT(columna): COUNT(D) cuenta los valores no nulos en la columna D. COUNT() sin argumento no es válido según la especificación de funciones de agregación del lenguaje de consultas de Google Visualization API, que exige exactamente un argumento de columna. En la práctica, a partir de junio de 2026 este error de sintaxis a veces se manifiesta como cannot group without agg en lugar de un mensaje más específico, lo que desperdicia tiempo en la depuración. Si ves el error y la agrupación parece correcta, revisa la sintaxis de tu COUNT.

Expresiones entre grupos: SUM(D)/COUNT(D) es válida (ambos componentes están agregados). SUM(D)/D no lo es (D en el denominador no está agregada). La regla aplica a cada término de cualquier expresión, no solo a referencias de columnas independientes.

ModelMonkey detecta este tipo de error de QUERY antes de escribir en la hoja y sugiere la fórmula corregida directamente en el panel lateral. Muy útil cuando estás seis niveles adentro de un modelo con múltiples pestañas y el mensaje de error por sí solo no identifica cuál columna es el problema.

Preguntas frecuentes

¿Qué significa exactamente el error cannot group without agg en Google Sheets? Significa que al menos una columna del SELECT no está cumpliendo ninguna de las dos condiciones que QUERY exige cuando usas GROUP BY: estar listada en GROUP BY (dimensión) o estar envuelta en una función de agregación como SUM, COUNT, AVG, MAX o MIN (medida). Identifica cuál columna rompe esa regla y aplica una de las dos correcciones.

¿Puedo usar QUERY GROUP BY con datos de varias pestañas? No directamente. QUERY no admite referencias a rangos de otras pestañas dentro del string de consulta. Si tu modelo tiene actuals en una pestaña y supuestos en otra, usa SUMIFS, que acepta referencias de celda nativas entre pestañas sin concatenación de texto.

¿Cuándo debo preferir QUERY GROUP BY sobre SUMIFS? Cuando el conjunto de valores de una dimensión es dinámico y no lo conoces de antemano. Por ejemplo, si el número de SKUs o regiones varía mes a mes, QUERY GROUP BY devuelve todas las combinaciones automáticamente. SUMIFS requiere que hardcodees cada valor, lo que se rompe en el momento en que aparece un nuevo elemento en los datos.

¿SUM(D)-SUM(E) en el SELECT dispara el error de agrupación? No, porque cada componente de la expresión está agregado por separado. El resultado de SUM(D)-SUM(E) es un único valor por grupo, que es exactamente lo que QUERY requiere. El error aparece solo cuando algún componente de la expresión referencia una columna sin agregar, como en SUM(D)-E.

¿El error cannot group without agg puede aparecer sin que exista un problema real de agrupación? Sí, en casos de sintaxis incorrecta de COUNT. Si escribes COUNT() sin argumento, la implementación de Google Visualization API lo rechaza, y el mensaje de error que aparece puede ser cannot group without agg en lugar de un aviso de sintaxis más claro. Verifica siempre que COUNT tenga exactamente un argumento de columna: COUNT(D).

En resumen

El error cannot group without agg significa que una o más columnas del SELECT no están agregadas ni están en GROUP BY. Audita cada columna: las dimensiones van en GROUP BY, las medidas llevan SUM/AVG/COUNT/MAX/MIN. Para trabajo entre pestañas o rangos de fecha dinámicos desde una pestaña de Supuestos, SUMIFS hace lo que QUERY no puede. Para conjuntos de dimensiones dinámicos donde no conoces los valores de antemano, el GROUP BY de QUERY es la opción más limpia.