power bi como montar un pl
Imagen de Laura Fattori

Laura Fattori

Business Intelligence Consultant | Data Specialist

Otros Artículos:

Cómo montar un P&L “no nativo” en Power BI y no morir en el intento

LinkedIn
Facebook
Twitter
WhatsApp

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:

				
					Dim PL =
DATATABLE(
    "Atributo", STRING,
    "Orden", INTEGER,
    "Nivel", INTEGER,
{
    {"Activity", 1, 0},
    {"Revenue", 2, 1},
    {"COGS", 3, 1},
    {"Gross Margin", 4, 0},
    {"Operating Costs", 5, 1},
    {"Operating Earnings", 6, 0},
    {"Net Earnings", 7, 0}
}
)

				
			

¿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:

				
					Atributo Display =
IF(
    Nivel = 0,
    "■ " & UPPER(Atributo),
    REPT(UNICHAR(160), 4 * Nivel) & Atributo
)

				
			

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:

				
					Tipo =
SWITCH(
    TRUE(),
    Atributo = "Ingreso", "Ingreso",
    Atributo IN {"Costes varios..."}, "Coste",
    "Resultado"
)

				
			

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

				
					MTD =
CALCULATE(
    SELECTEDMEASURE(),
    DATESMTD(Calendar[Date])
)

YTD =
CALCULATE(
    SELECTEDMEASURE(),
    DATESYTD(Calendar[Date], "08/31")
)

				
			

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

				
					Actual
CALCULATE(
    SELECTEDMEASURE(),
    Fact[Category] = "Actual"
)

Budget
CALCULATE(
    SELECTEDMEASURE(),
    Fact[Category] = "Budget"
)

				
			

¿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.

				
					Variance =
VAR ActualValue = ...
VAR BudgetValue = ...

RETURN
SWITCH(
    TRUE(),
    Atributo IN {Grupo1}, ActualValue - BudgetValue,
    Atributo IN {Grupo2}, BudgetValue - ActualValue,
    BudgetValue - ActualValue
)

				
			

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:

				
					GROSS_MARGIN =
(if [Data] = "X"
and [Linea] <> "Y"
then [Value]
else null) * -

				
			

👉 Creamos columnas por cada métrica relevante
👉 Aplicamos condiciones directamente en el ETL

Después:

✅ Hacemos un UNPIVOT
✅ Convertimos muchas columnas en dos:

  • Nombre de métrica
  • Valor

¿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 😄

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Business Data Master Logo

No te pierdas el

WEBINAR
Gratuito

Explicaremos en detalle los contenidos y objetivos del Business Data Master

29/11/2021

18:30 (GTM+1)

Online

BUSINESS DATA MASTER

* Tu información será utilizada exclusivamente para contactarte en relación al Business Data Master. No hacemos spam ni compartimos datos con terceros.

Best Data Solutions - Logo
Resumen de privacidad

Esta web utiliza cookies para que podamos ofrecerte la mejor experiencia de usuario posible. La información de las cookies se almacena en tu navegador y realiza funciones tales como reconocerte cuando utilizas nuestra web para personalizar el idioma o ayudar a nuestro equipo a comprender qué secciones de la web son más visitadas.