Visual Calculations Novedad 2024

Las funciones DAX que solo viven dentro de los visuals de Power BI — la mayor novedad de 2024

Intermedio Avanzado
🔍

¿Qué son las Visual Calculations? 🤔

Las Visual Calculations son un tipo especial de cálculo DAX introducido en Power BI en 2024 que se define directamente sobre un visual (tabla, matriz, gráfico) en lugar de en el modelo de datos. La diferencia clave:

  • Las MEDIDAS normales se calculan en el modelo → resultado independiente del visual
  • Las VISUAL CALCULATIONS se calculan SOBRE la estructura del visual → pueden acceder a las filas de arriba, de abajo, al total del nivel, etc.
Analogía kawaii 🌸
Imagina que las medidas normales son como un chef que cocina en la cocina central (el modelo). Las Visual Calculations son como una persona que está directamente en la mesa y puede ver exactamente lo que hay servido delante, a los lados y en el plato de al lado — y hacer cálculos con eso.

¿Por qué son tan útiles?

Antes de Visual Calculations, calcular un acumulado en una tabla que respetara el orden visual era MUY complicado en DAX (requería WINDOW, RANKX, etc.). Ahora con una línea: RUNNINGSUM([Ventas]).

⚠️ Importante
Las Visual Calculations SOLO funcionan dentro de visuals de Power BI Desktop (tablas, matrices, gráficos). NO se pueden usar en medidas normales, columnas calculadas, tablas calculadas ni en expresiones de RLS. Son exclusivas del contexto visual.
⚙️

¿Cómo se activan y crean?

Para crear una Visual Calculation, sigue estos pasos:

  1. Selecciona un visual de tabla o matriz en tu informe
  2. En el menú superior de Power BI Desktop, ve a "Calculations" (o "Cálculos")
  3. Haz clic en "New visual calculation"
  4. Se abre un editor DAX especial — aquí escribes tu fórmula
  5. La fórmula tiene acceso a las funciones especiales de Visual Calculations

Diferencia en el editor: en el editor de Visual Calculations verás una vista previa del visual con la nueva columna calculada añadida directamente.

💡 Tip importante
Las Visual Calculations no aparecen en el panel de campos ni en el modelo. Son locales al visual donde las creas. Si quieres el mismo cálculo en otro visual, tienes que crearlo de nuevo — o usar una medida normal con WINDOW (más complejo pero reutilizable).
📈

RUNNINGSUM — Totales acumulados

RUNNINGSUM(<expresión>, [reset])
Intermedio
Calcula el total acumulado (running sum) de una expresión a lo largo de las filas del visual. Opcional: el parámetro reset indica cuándo reiniciar el acumulado (NONE, LOWESTPARENT, HIGHESTPARENT, GRANDTOTAL o un nivel numérico).

Ejemplo básico:

// En una tabla con columnas: Mes | Ventas | (nueva columna visual)
// La columna "Ventas Acumuladas" se crea como Visual Calculation:
Ventas Acumuladas = RUNNINGSUM([Ventas])

// Resultado:
// Enero     → 10.000
// Febrero   → 25.000  (10.000 + 15.000)
// Marzo     → 42.000  (25.000 + 17.000)
// ...

Ejemplo con reset en una matriz con años y meses:

// Reset en cada año (al llegar a enero del año siguiente, vuelve a 0)
Ventas Acumuladas YTD = RUNNINGSUM([Ventas], HIGHESTPARENT)

// 2023 / Enero   → 10.000
// 2023 / Febrero → 25.000
// 2023 / Diciembre → 150.000
// 2024 / Enero   → 12.000  ← reinicia!
// 2024 / Febrero → 28.000

Comparativa visual (antes vs después):

// ❌ ANTES (medida DAX compleja para el mismo resultado):
Ventas Acum Medida =
CALCULATE(
    SUM('Ventas'[Importe]),
    FILTER(
        ALLSELECTED('Calendario'),
        'Calendario'[Fecha] <= MAX('Calendario'[Fecha])
    )
)

// ✅ AHORA con Visual Calculations:
Ventas Acumuladas = RUNNINGSUM([Ventas])
// ¡Una línea!
💡 Tip
RUNNINGSUM es equivalente a TOTALYTD en algunos contextos, pero mucho más flexible porque trabaja sobre cualquier dimensión del visual, no solo fechas. Y no requiere tabla de calendario marcada. 🎉
📊

MOVINGAVERAGE — Media móvil

MOVINGAVERAGE(<expresión>, ventana, [incluir_blancos], [eje], [reset])
Intermedio — Avanzado
Calcula la media móvil de N períodos anteriores (incluyendo el actual). Perfecta para suavizar series temporales y detectar tendencias.

Ejemplo básico (media móvil de 3 meses):

// Media de los últimos 3 meses (incluye el mes actual)
Media Móvil 3M = MOVINGAVERAGE([Ventas], 3)

// Enero    → Ventas enero (solo hay 1 mes)
// Febrero  → (enero + febrero) / 2
// Marzo    → (enero + febrero + marzo) / 3
// Abril    → (febrero + marzo + abril) / 3  ← ventana deslizante

Ejemplo (media móvil de 12 meses — tendencia anual):

// Tendencia de los últimos 12 meses
Tendencia 12M = MOVINGAVERAGE([Ventas], 12)
// Muy útil para eliminar la estacionalidad y ver la tendencia real

Comparativa con medida DAX equivalente:

// ❌ Medida DAX equivalente (mucho más compleja):
Media Móvil 3M Medida =
VAR FechaActual = MAX('Calendario'[Fecha])
VAR Ventana =
    CALCULATETABLE(
        VALUES('Calendario'[Mes]),
        DATESINPERIOD('Calendario'[Fecha], FechaActual, -3, MONTH)
    )
RETURN AVERAGEX(Ventana, CALCULATE(SUM('Ventas'[Importe])))

// ✅ Visual Calculation:
Media Móvil 3M = MOVINGAVERAGE([Ventas], 3)
🌲

COLLAPSE y EXPAND — Navegación por jerarquías

Estas funciones solo tienen sentido en matrices con jerarquías (como Año > Trimestre > Mes). Permiten acceder a valores de niveles superiores (padres) o inferiores (hijos) de la jerarquía directamente desde el visual.

COLLAPSE(<expresión>, <eje>) | COLLAPSEALL(<expresión>, <eje>)
Avanzado
COLLAPSE sube un nivel en la jerarquía del visual (al padre inmediato). COLLAPSEALL sube hasta el nivel más alto (el abuelo/raíz). Útil para calcular % sobre el padre.

Ejemplo — % sobre el total del año (padre del mes):

// En una matriz Año > Mes, columna "% del Año"
% del Año = DIVIDE([Ventas], COLLAPSE([Ventas], ROWS))

// Enero 2024   → 8,3%   (ventas enero / total 2024)
// Febrero 2024 → 9,1%
// Total 2024   → 100%  (se colapsa a sí mismo)

// COLLAPSEALL: % sobre el gran total
% del Total = DIVIDE([Ventas], COLLAPSEALL([Ventas], ROWS))
EXPAND(<expresión>, <eje>) | EXPANDALL(<expresión>, <eje>)
Avanzado
Lo contrario de COLLAPSE — baja un nivel (a los hijos). EXPANDALL baja hasta el nivel más detallado. Útil cuando en el nivel padre quieres calcular algo basado en los hijos.

Ejemplo — Media de los hijos:

// En la fila "2024 Total": mostrar la media mensual
Media Hijos = EXPAND(AVERAGE([Ventas]), ROWS)
🎯

RANGE — Ventanas relativas personalizadas

RANGE(<start>, <end>) — se usa como parámetro de ventana
Avanzado
Define una ventana relativa de filas para funciones como WINDOW. Permite especificar exactamente qué rango de filas incluir en el cálculo.

Ejemplo — Total de los últimos 3 meses excluyendo el actual:

// Suma de las 3 filas anteriores (sin incluir la actual)
Ventas 3M Anteriores =
CALCULATE(
    SUM([Ventas]),
    RANGE(-3, -1)
)

// Marzo: suma de enero + febrero + (el que sea anterior a marzo)
⚖️

¿Cuándo usar Visual Calculations vs medidas normales?

CARACTERÍSTICA MEDIDAS NORMALES VISUAL CALCULATIONS
Dónde se definen En el modelo (pestaña de datos) Directamente sobre el visual
Reutilizables ✅ En cualquier visual ❌ Solo en ese visual
Acceso a filas vecinas ❌ Complejo (WINDOW, OFFSET) ✅ PREVIOUS, NEXT, FIRST, LAST
Rendimiento ✅ Mejor para cálculos complejos ⚠️ Limitado a datos ya en el visual
Disponible en RLS ✅ Sí ❌ No
Disponible en Export ⚠️ Depende ❌ No siempre
Nivel de dificultad 🔴 Alto para acumulados 🟡 Medio
Requiere tabla calendario ✅ Para time intelligence ❌ No siempre
Regla práctica 🌸
Si el cálculo lo vas a usar en UN solo visual y depende del orden o posición de las filas → Visual Calculations. Si lo vas a usar en varios visuals o necesitas reutilizarlo → Medida normal. Y si dudas, empieza con la medida — siempre puedes crear una Visual Calculation encima. 💡
⚠️

Cosas importantes que debes saber

  1. Solo disponibles en Power BI Desktop — no en Report Builder ni Embedded antiguo
  2. No se exportan a Excel con todo su detalle
  3. No se pueden usar en expresiones de RLS
  4. No funcionan en todos los tipos de visual — principalmente tablas, matrices y algunos gráficos
  5. No son medidas del modelo — no aparecen en DAX Studio ni en el panel de campos para otros visuals
  6. El parámetro [eje] puede ser ROWS o COLUMNS — en matrices bidimensionales hay que especificarlo bien
  7. El parámetro [reset] controla cuándo se reinicia el cálculo al cambiar de nivel en jerarquías
🚀 Siguiente paso
¡Enhorabuena! Ya conoces las Visual Calculations — una de las incorporaciones más esperadas de Power BI. Si quieres el control más fino sobre ventanas de filas desde el modelo (sin depender del visual), el siguiente paso son las Window Functions.