lección 8
Tablas dinámicas: el GROUP BY que se arrastra con el ratón
Qué es una tabla dinámica, cómo se construye mentalmente (filas, columnas, valores), cuándo se queda corta y cómo se traduce a SQL.
⏱ 50 min
Hay un momento en la vida de cualquier analista en el que tiene una tabla con tres mil filas de ventas y alguien le pregunta: "cuánto vendimos por región y por mes?". La primera tentación es hacer un SUMAR.SI.CONJUNTO para cada combinación (enero-Madrid, enero-Barcelona, febrero-Madrid...). Tres regiones por doce meses son 36 fórmulas, copiadas a mano y rezando para no equivocarte. Y cuando tu jefe dice "ah, y ahora pártelo también por categoría de producto", las 36 fórmulas se multiplican por diez y el informe se derrumba.
La tabla dinámica (en inglés pivot table) resuelve exactamente ese dolor. Es una herramienta que toma tus datos crudos y te deja arrastrar campos con el ratón para decir "quiero las regiones como filas, los meses como columnas, y la suma de ingresos como valor". En un segundo tienes la tabla resumen que con fórmulas habrías tardado media hora en montar. Y si mañana tu jefe quiere verlo por trimestre en vez de por mes, arrastras un campo y listo. No reescribes nada.
La tabla dinámica no es magia. Por dentro está haciendo exactamente lo mismo que un GROUP BY en SQL: agrupar filas por las dimensiones que elijas y aplicar una función de agregación (suma, cuenta, media) a la métrica que pongas en valores. La diferencia es que en SQL escribes la consulta con texto, y en la hoja arrastras cajitas. El resultado es el mismo: un resumen de muchas filas en pocas. Por eso esta lección existe justo aquí: si ya entiendes GROUP BY, entender la tabla dinámica es traducir un idioma que ya hablas.
### La anatomía de una tabla dinámica: filas, columnas y valores
Piensa en una tabla dinámica como una mesa de tres patas. La primera pata son las filas: qué quieres ver en el eje vertical. La segunda son las columnas: qué quieres ver en el eje horizontal. La tercera son los valores: qué número quieres calcular en cada celda donde se cruzan una fila y una columna. Y hay una cuarta zona, los filtros, que simplemente dice "antes de hacer todo eso, quédate solo con los datos que cumplen esta condición".
Traducido a SQL, la tabla dinámica que muestra "ingresos por región y mes" es esto:
1SELECT2 region, -- lo que va en FILAS3 mes, -- lo que va en COLUMNAS4 SUM(importe) -- lo que va en VALORES5FROM ventas6WHERE anio = 2024 -- lo que va en FILTROS7GROUP BY region, mes;
La misma tabla dinámica, escrita en SQL
Y esa es la diferencia clave entre el resultado de un GROUP BY y una tabla dinámica: la forma. SQL te devuelve una tabla "larga" con una fila por cada combinación (Madrid-enero, Madrid-febrero, Barcelona-enero...). La tabla dinámica toma esos mismos datos y los "pivota": pone una dimensión en filas y otra en columnas, creando una tabla cruzada donde cada celda es un valor único. Es más fácil de leer para un humano, pero es el mismo cálculo por debajo.
### Por qué existe la tabla dinámica: una historia de urgencia
La idea de la tabla dinámica es de 1986, cuando Pito Salas empezó a trabajar en ella dentro del grupo de tecnología avanzada de Lotus. El producto tardó bastante más: Lotus Improv se lanzó en febrero de 1991, y no para Windows ni para Mac, sino para NeXTSTEP, el sistema de las máquinas de NeXT. La idea original era revolucionaria para la época: separar los datos de la vista. En vez de que la hoja de cálculo fuera un lienzo donde mezclas datos y fórmulas —lo que hoy sigue siendo el problema fundamental de Excel—, Improv tenía una zona de datos y una zona de presentación. Podías reorganizar cómo veías los números sin tocar los números.
Y aquí viene lo interesante, porque es exactamente la misma historia que te contó la primera lección de esta sección. Lotus tuvo la idea buena y la sacó en la plataforma que nadie tenía: NeXTSTEP era una maravilla técnica con una cuota de mercado minúscula. Microsoft llevó la tabla dinámica a Excel 5.0, que se puso a la venta en diciembre de 1993 y llegó a los escritorios a principios de 1994, en la plataforma que tenía todo el mundo. Lotus dejó de desarrollar Improv en agosto de 1994 y lo canceló en abril de 1996. Es la misma moraleja que con Lotus 1-2-3 contra Excel, con los mismos protagonistas y diez años después: en software, la idea buena en la plataforma equivocada pierde contra la idea copiada en la plataforma que la gente ya tiene.
¿Por qué importa esta historia? Porque la tabla dinámica se inventó para un mundo sin SQL accesible. En 1994 las bases de datos las consultaba un administrador con acceso a la terminal; el director de ventas no podía escribir un GROUP BY. La tabla dinámica le dio esa capacidad al usuario de negocio, envuelta en una interfaz visual. Hoy, más de treinta años después, sigue resolviendo el mismo problema: "necesito un resumen rápido y no quiero, o no puedo, escribir una consulta". Y eso es perfectamente legítimo. No todo el mundo debe saber SQL para responder una pregunta de negocio.
Consejo de senior: en una entrevista técnica, si te piden resolver algo con tabla dinámica y tú prefieres SQL, menciónalo: "Esto lo resolvería con un GROUP BY y CASE WHEN para pivotar, pero si lo necesitas rápido y visual para un director que no lee SQL, una tabla dinámica es la herramienta correcta". Demuestras que conoces ambos caminos y que eliges por contexto, no por costumbre.
### Construir una tabla dinámica paso a paso (modelo mental)
No vamos a hacer un tutorial de "haz clic aquí y luego allá", porque eso depende de si usas Excel, Google Sheets o LibreOffice y de qué versión tengas. Lo que sí es universal es el proceso mental, que es el mismo en las tres herramientas y el mismo que usarás en SQL cuando la tabla dinámica no alcance.
- 01.Define la pregunta: "cuánto vendimos por región y por mes?" — necesitas una métrica (venta) y dos dimensiones (región y mes).
- 02.Identifica las columnas de tus datos crudos: cuál es la métrica (importe), cuáles son las dimensiones (región, fecha). Si la fecha está en formato día y quieres agrupar por mes, necesitarás que la herramienta la agrupe por ti.
- 03.Elige dónde va cada cosa: la dimensión principal (región) a filas, la secundaria (mes) a columnas, la métrica (importe) a valores con función SUM.
- 04.Aplica filtros si hacen falta: "solo 2024", "solo tiendas físicas".
- 05.Lee el resultado como lo leería tu jefe: "Madrid en marzo vendió 48.300, un 17% más que Barcelona". Esas dos cifras salen del dataset del segundo ejercicio, así que las vas a ver aparecer cuando lo hagas.
Ese proceso es idéntico en SQL. La única diferencia es que en SQL lo escribes con texto y en la hoja lo arrastras con el ratón. Cuando dominas el modelo mental, la herramienta es un detalle. Puedes pasar de la tabla dinámica a SQL y de SQL a la tabla dinámica sin esfuerzo, porque entiendes que debajo está el mismo GROUP BY.
### Campos calculados: cuando la métrica no está en los datos
A veces la métrica que necesitas no existe como columna en tus datos crudos. Tienes "ingresos" y "coste", pero quieres ver el "margen" (ingresos - coste). O tienes "unidades vendidas" e "ingresos" y quieres ver el "precio medio" (ingresos / unidades). La tabla dinámica no te deja simplemente escribir una fórmula en una celda del resultado, porque ese resultado se recalcula cada vez que cambias la configuración. Para eso existen los campos calculados.
Un campo calculado es una nueva métrica que defines a partir de los campos existentes. En Excel vas a "Campos, elementos y conjuntos > Campo calculado" y escribes la fórmula: margen = ingresos - coste. A partir de ese momento puedes arrastrar "margen" a la zona de valores como si fuera una columna más de tus datos. Por debajo, la tabla dinámica aplica esa fórmula a cada celda del resultado después de agregar.
Cuidado con los campos calculados y las medias. Si defines precio_medio = ingresos / unidades como campo calculado, la tabla dinámica primero suma los ingresos y las unidades por grupo y DESPUÉS divide. Eso es correcto (es una media ponderada). Pero si en vez de eso pones una columna "precio_unitario" en los datos crudos y le pides la MEDIA como función de agregación, la tabla dinámica hace la media aritmética de los precios unitarios, que NO es lo mismo cuando las cantidades vendidas son distintas. Es el clásico error de "promediar promedios". En SQL evitas este fallo porque escribes SUM(ingresos) / SUM(unidades) explícitamente.
### Las funciones de agregación disponibles
Cuando arrastras un campo numérico a la zona de valores, la tabla dinámica asume SUM por defecto. Pero puedes cambiarlo a CUENTA (COUNT), MEDIA (AVERAGE), MAX, MIN, PRODUCTO, CONTAR NÚMEROS, DESVEST (desviación estándar) o VARIANZA. En Google Sheets las opciones son las mismas pero los nombres están en inglés. Lo importante es saber que la función de agregación que elijas cambia completamente el significado de la tabla: "suma de ingresos por región" y "media de ingresos por región" responden preguntas distintas.
Y hay un caso especial que confunde a todo el mundo: campos de texto en valores. Si arrastras un campo de texto (como "nombre_producto") a valores, la tabla dinámica por defecto aplica CUENTA: cuenta cuántas filas hay en cada grupo. Eso es un COUNT(*) en SQL, y sirve para contar pedidos o transacciones.
Pero cuidado con una cosa que se da por supuesta y no es verdad: la CUENTA de una tabla dinámica NO deduplica. Si un cliente ha hecho cinco pedidos, la cuenta te devuelve cinco, no uno. O sea que no sirve para responder "cuántos clientes distintos compraron en marzo", que es una pregunta que te van a hacer mucho. Ese recuento distinto —el COUNT(DISTINCT cliente_id) de SQL— existe en Excel, pero hay que pedirlo: al crear la tabla dinámica tienes que marcar "Agregar estos datos al Modelo de datos", y entonces aparece "Recuento distinto" en la lista de funciones. No está en Excel 2010 ni anteriores, y no está en Excel para Mac. En SQL es una palabra: DISTINCT. Es uno de esos sitios donde la hoja te cobra en clics lo que la consulta te cobra en ocho letras.
Consejo de senior: un truco que usan los analistas experimentados es poner el MISMO campo dos veces en valores con funciones distintas. Por ejemplo: SUM(importe) y COUNT(importe) en la misma tabla. Así ves a la vez el total y el número de transacciones, sin tener que hacer dos tablas dinámicas. En SQL sería como tener SUM(importe) y COUNT(*) en el mismo SELECT.
### Cuando la tabla dinámica se queda corta
La tabla dinámica es potente, pero tiene límites concretos. Reconocerlos es tan importante como saber usarla, porque el error del analista junior no es fallar con la herramienta: es no darse cuenta de que necesita otra. Estos son los cinco momentos en los que la tabla dinámica deja de ser suficiente y necesitas SQL:
- 01.Necesitas cruzar datos de dos ficheros distintos. La tabla dinámica trabaja sobre UNA tabla (o un modelo de datos en Excel con PowerPivot, que es otra historia). Si los datos están en dos CSV, dos pestañas o dos bases de datos distintas, necesitas un JOIN, y eso es SQL.
- 02.Necesitas lógica condicional compleja en la agregación. "Suma las ventas, pero solo si el cliente fue captado en los últimos 90 días Y el producto es de la categoría premium Y no ha devuelto nada en el último mes". En SQL lo haces con CASE WHEN dentro del SUM y subconsultas. En la tabla dinámica necesitas crear columnas auxiliares en los datos crudos, lo cual es frágil y difícil de mantener.
- 03.Necesitas más de dos o tres dimensiones a la vez. La tabla dinámica muestra filas y columnas: dos dimensiones. Puedes anidar (poner región > ciudad en filas), pero con tres o cuatro niveles el resultado es ilegible. En SQL no hay límite: tu GROUP BY puede tener diez campos y el resultado se lee igual.
- 04.Los datos tienen más de un millón de filas. Excel tiene un límite duro de 1.048.576 filas por hoja. Si tu tabla de eventos tiene cinco millones, ni siquiera puedes abrirla. Google Sheets no limita las filas sino las celdas —diez millones en total—, así que ahí el techo depende de cuántas columnas tengas: con veinte columnas te quedas en medio millón de filas. SQL no tiene límite práctico para una consulta.
- 05.Necesitas repetir el análisis cada semana y que siempre sea igual. La tabla dinámica es interactiva: alguien puede mover un campo sin querer y el informe cambia. Una consulta SQL es texto: se ejecuta hoy y dentro de seis meses y da el mismo resultado con los mismos datos. Es reproducible.
La moraleja no es "la tabla dinámica es mala". Es "la tabla dinámica es un prototipo magnífico". Muchos analistas seniors siguen usándola como primer paso: montan un resumen rápido en la hoja para confirmar que la pregunta está bien planteada y que los datos tienen sentido, y solo después escriben la consulta SQL que va al informe automatizado. Es lo mismo que hacer un boceto a lápiz antes de pintar al óleo.
### El error más caro: la tabla dinámica sobre datos sucios
Una tabla dinámica no valida tus datos. Si la columna "region" tiene "Madrid", "madrid", "MADRID" y " Madrid " (con espacio), la tabla dinámica te mostrará cuatro filas distintas en vez de una. No te avisa. No las agrupa. Te da un resultado que parece correcto pero está mal, y si no te fijas lo entregas así. En SQL tendrías el mismo problema, pero al escribir el GROUP BY es más natural pensar "tengo que normalizar esto primero". En la tabla dinámica, como solo arrastras un campo, la limpieza previa se olvida con más facilidad.
Por eso la próxima lección trata de limpieza en la hoja: porque sin limpieza, cualquier resumen — sea tabla dinámica o GROUP BY — está mintiendo sin que nadie lo sepa.
### Resumen
- Una tabla dinámica es un GROUP BY visual: agrupa filas por dimensiones y aplica una función de agregación.
- Tiene cuatro zonas: filas (dimensión vertical), columnas (dimensión horizontal), valores (métrica), filtros (WHERE).
- Los campos calculados permiten crear métricas derivadas (margen, precio medio) sin tocar los datos originales.
- Se queda corta cuando necesitas cruces entre tablas, lógica condicional compleja, más de un millón de filas o reproducibilidad.
- No es inferior a SQL: es complementaria. Prototipa rápido, produce en SQL cuando la hoja no alcanza.
Regístrate para guardar tu progreso.
## comentarios
Reporta erratas, ayuda a otros o comparte tu opinión. Sé constructivo.
Inicia sesión para comentar y responder.
cargando comentarios...