Cómo montar un P&L “no nativo” en Power BI y no morir en el intento
Si alguna vez has intentado construir un Profit & Loss (P&L) en Power BI con una estructura “clásica” (de las que vienen de Excel, SAP o el legado de toda la vida), sabrás que no es precisamente plug & play. Power BI no nació pensando en este tipo de reportes jerárquicos con cálculos intermedios, subtotales semánticos y lógica contable personalizada.
Pero tranquilo: con un poco de ingenio y tres ingredientes clave —grupos de cálculo, una tabla de estructura desacoplada y medidas inteligentes— puedes construir un P&L elegante, dinámico y mantenible.
Vamos a verlo paso a paso.
El problema: Power BI matriz nativa vs P&L “de toda la vida”
Power BI trabaja mejor con modelos tabulares “puros”: dimensiones limpias, métricas consistentes y agregaciones simples.
En una matriz estándar de Power BI, el resultado suele ser algo así:
- Filas = dimensiones reales (producto, cuenta…)
- Columnas = medidas separadas
- Subtotales automáticos (sin semántica contable)
Un P&L clásico, en cambio, tiene:
- Líneas que no existen en los datos base (e.g., márgenes, subtotales)
- Colu Columnas de Actual, Budget y Variance apiladas verticalmente, no cada una en columnas separadas
- Cálculos que dependen del contexto contable
- Jerarquías visuales que no coinciden con dimensiones reales
- Variaciones que cambian de signo según la naturaleza del concepto
Si a esta altura ya estás pensando “esto no hay manera de hacerlo bien”, tranquil@… respira 😄
La clave está en desacoplar la estructura del dato y reconstruirla en el modelo.
1. La clave: una tabla de estructura personalizada
Creamos una tabla completamente independiente del modelo que define el esqueleto del P&L:
¿Qué está pasando aquí?
- Definimos manualmente el orden del P&L
- Indicamos niveles jerárquicos (para sangrías)
- Creamos líneas que no existen físicamente en el fact
Esto nos permite controlar:
✅ El orden exacto
✅ La indentación
✅ Los subtotales lógicos
Además, añadimos una columna calculada para mejorar la visualización:
Resultado: tienes un P&L que ya empieza a parecerse sospechosamente a Excel (y eso aquí es bueno).
2. Clasificación: ingresos, costes y resultados
Otra mejora importante es clasificar cada línea según su naturaleza:
Esto es clave para:
- Formato condicional (colores, estilos)
- Visual UX (por ejemplo, diferenciar rápidamente márgenes de costes)
- Lógica de variaciones
Porque no todos los números se comportan igual:
Ejemplos prácticos:
- Revenue (Ingreso)
- Budget: 1.000
- Actual: 900
- Variance: -100 → malo
- Coste
- Budget: 500
- Actual: 450
- Variance: +50 → bueno
👉 Mismo cálculo → interpretación opuesta
👉 Por eso necesitamos lógica diferente
Finalmente, se configuran los detalles del servicio, se prueba la conexión y creamos el linked service.
3. Grupos de cálculo: el superpoder oculto
Aquí es donde la magia ocurre 🪄
Los Calculation Groups nos permiten reutilizar lógica sobre cualquier medida sin duplicar código.
Creamos dos Calculation Groups.
1-Time Intelligence
Ventajas:
✅ Reutilizable para cualquier métrica
✅ Cero duplicación
✅ Modelo limpio
2-Escenarios: Actual, Budget y Variance
El segundo grupo de cálculo nos permite forzar el “escenario” ¿para qué nos sirve esto?
Para poder tener en una misma columna una debajo de otra todas las métricas de Activity, de Budget y de Variance respectivamente, recordemos que Power BI nativamente pondría cada métrica en una columna generando un scrool interminable y poco claro para el análisis.
Nosotros lo resolveremos metiendo los escenarios en columnas usando Calculation Groups
¿Por qué esto es crítico?
Porque permite que la matriz tenga este formato:
| | MTD Actual | MTD Budget | MTD Var |
Revenue | X | X | X |
COGS | X | X | X |
En lugar de esto:
| Revenue Actual | Revenue Budget | Revenue Var | COGS Actual | … |
4. Variance inteligente (el truco que marca la diferencia)
Aquí viene lo divertido.
No todas las variaciones deben calcularse igual:
- Para ingresos: Actual – Budget
- Para costes: Budget – Actual
Y además, algunos conceptos especiales siguen reglas propias.
La solución: lógica condicional basada en el atributo.
Resultado:
- Variaciones coherentes
- Signos correctos sin hacks visuales
- Negocios felices
Bonus clave: mover cálculos a Power Query
Este punto suele marcar la diferencia entre un modelo que va fluido y uno que sufre.
En lugar de hacer todo en DAX, preparamos las métricas en Power Query:
Ejemplo:
👉 Creamos columnas por cada métrica relevante
👉 Aplicamos condiciones directamente en el ETL
Después:
✅ Hacemos un UNPIVOT
✅ Convertimos muchas columnas en dos:
¿Qué ganamos con esto?
- Muchísimo mejor rendimiento
- DAX más simple
- Perfecta integración con Calculation Groups
- Escalabilidad real
En resumen:
👉 menos magia en DAX
👉 más inteligencia en el modelo
👉 evitar problemas de rendimiento
👉 evitar errores por exceder limites
5. La matriz: Al fin vamos a ver si todo esto funciona
Configuración final:
- Filas → Atributo Display
- Columnas → Calculation Groups (Tiempo + Escenario)
- Valores → medida base (Ej., Amount)
El resultado (como la imagen):
- Columnas agrupadas por MTD y YTD
- Dentro de cada grupo: Actual, Budget y Variance
- Filas jerárquicas con indentación
- Subtotales reales de negocio
👉 Esto ya es un P&L de verdad, tal y como lo quiere ver negocio.
Ventajas del enfoque además de resolverte la vida
✅ Escalable
✅ Mantenible
✅ Flexible
✅ Rendimiento optimizado
✅ Legible para negocio
✅ Profesional (nivel consultoría top 😉)
Y lo mejor: si cambia la estructura del P&L, solo modificas la tabla de dimensión. No tocas el modelo base.
Reflexión final
Construir un P&L en Power BI es casi un rite of passage.
Al principio parece que estás peleando contra la herramienta… pero en realidad estás cambiando la forma de pensar:
👉 De “cómo replico Excel”
👉 A “cómo modelo lógica de negocio”
Cuando lo haces, Power BI deja de ser una limitación… y se convierte en un lienzo.
Si has llegado hasta aquí, enhorabuena: ya estás a un paso de convertir tus reportes financieros en algo mucho más potente (y mucho menos doloroso).
Y recuerda:
si tu P&L funciona sin parches raros… probablemente lo estás haciendo muy bien 😄