Fórmulas DAX que todo usuario empresarial debería conocer

Domine 20 fórmulas DAX esenciales para Power BI. CALCULATE, inteligencia del tiempo, RANKX, transición de contexto, iteradores y ejemplos prácticos de negocios.

E
ECOSIRE Research and Development Team
|17 de marzo de 202617 min de lectura3.7k Palabras|

Parte de nuestra serie Data Analytics & BI

Leer la guía completa

Fórmulas DAX que todo usuario empresarial debería conocer

DAX (Expresiones de análisis de datos) es el lenguaje de fórmulas que transforma Power BI de una simple herramienta de gráficos a un motor analítico completo. Si bien la interfaz de arrastrar y soltar de Power BI maneja agregaciones básicas, la inteligencia empresarial real requiere DAX. Las comparaciones año tras año, los promedios móviles, las clasificaciones, los escenarios hipotéticos y los KPI complejos dependen de las fórmulas DAX.

El desafío es que DAX parece engañosamente simple pero se comporta de manera que sorprende incluso a los usuarios experimentados de Excel. Los conceptos de contexto de filtro, contexto de fila y transición de contexto son exclusivos de DAX y no tienen equivalente directo en Excel o SQL. Esta guía se centra en las 20 fórmulas DAX más prácticas para usuarios empresariales, con ejemplos del mundo real que puede adaptar de inmediato.


Conclusiones clave

  • CALCULATE es la función DAX más importante: modifica el contexto del filtro y se utiliza en más del 80 por ciento de las medidas no triviales.
  • Las funciones de inteligencia horaria (TOTALYTD, SAMEPERIODLASTYEAR, DATEADD) requieren una tabla de fechas adecuada marcada como tal en el modelo.
  • La sintaxis VAR/RETURN hace que las medidas complejas sean legibles y evita cálculos redundantes
  • Las funciones iteradoras (SUMX, AVERAGEX, RANKX) evalúan expresiones fila por fila, mientras que los agregadores (SUM, AVERAGE) operan en columnas.
  • La transición de contexto ocurre cuando una columna calculada o un iterador llama a una medida, convirtiendo el contexto de la fila en contexto de filtro.
  • SWITCH(TRUE(), ...) reemplaza declaraciones IF anidadas y es mucho más legible
  • ALL, ALLEXCEPT y REMOVEFILTERS controlan qué filtros están activos, pero tenga cuidado con las implicaciones de RLS

Fundación: contexto de filtro y contexto de fila

Antes de sumergirnos en las fórmulas, es fundamental comprender estos dos conceptos. Cada confusión en DAX se remonta al contexto del filtro y al contexto de la fila.

Filtrar contexto

El contexto del filtro es el conjunto de filtros aplicados a un cálculo. Proviene de segmentaciones, filtros visuales, filtros de página, filtros de informes y RLS. Cuando coloca una medida en un objeto visual de matriz con "Año" en las filas y "Región" en las columnas, cada celda tiene un contexto de filtro único: (Año = 2025, Región = Norteamérica), (Año = 2025, Región = EMEA), etc.

Cada función de agregación DAX (SUM, AVERAGE, COUNT, MIN, MAX) se evalúa dentro del contexto de filtro actual. SUM(Sales[Revenue]) en una celda filtrada hasta 2025 + Norteamérica solo suma las filas de ingresos que coinciden con ambas condiciones.

Contexto de fila

El contexto de fila existe dentro de columnas calculadas y funciones de iterador. Significa "la fila actual". En una columna calculada en la tabla Ventas, Sales[Revenue] * Sales[Quantity] evalúa cada fila individualmente.

Transición de contexto

Cuando una función iteradora (como SUMX) llama a una medida, el contexto de la fila se convierte automáticamente en un contexto de filtro. Esto se llama transición de contexto. Es poderoso pero puede ser una fuente de problemas de rendimiento si se usa incorrectamente.

-- Row context exists here (iterating over Products)
Revenue Per Product =
SUMX(
    Products,
    [Total Revenue]  -- This measure is evaluated in filter context
                     -- where the current product's ID filters the Sales table
)

Comprender estos conceptos hace que cada fórmula DAX sea intuitiva. Sin ellos, las fórmulas DAX parecen cajas negras.


Las 20 Fórmulas Esenciales

1. CALCULAR: modificar el contexto del filtro

CALCULATE es la función DAX más importante. Evalúa una expresión en un contexto de filtro modificado.

Sintaxis: CALCULATE(expression, filter1, filter2, ...)

Ejemplo: ingresos solo por pedidos grandes

Large Order Revenue =
CALCULATE(
    SUM(Sales[Revenue]),
    Sales[OrderTotal] > 10000
)

Ejemplo: ingresos de una categoría de producto específica

Electronics Revenue =
CALCULATE(
    SUM(Sales[Revenue]),
    Products[Category] = "Electronics"
)

CALCULATE reemplaza el filtro existente en la columna especificada. Si una segmentación de datos ya filtra la categoría como "Ropa", la medida Ingresos por productos electrónicos ignora esa segmentación y muestra los ingresos por productos electrónicos porque CALCULATE anula el filtro de categoría.

2. FILTRO: filtrado a nivel de fila

FILTER devuelve una tabla filtrada por una condición. A menudo se usa dentro de CALCULATE para filtrado complejo que no se puede expresar como una simple comparación de columnas.

Sintaxis: FILTER(table, condition)

Ejemplo: Ingresos de clientes con más de 5 pedidos

Revenue From Repeat Customers =
CALCULATE(
    SUM(Sales[Revenue]),
    FILTER(
        Customers,
        CALCULATE(COUNTROWS(Sales)) > 5
    )
)

Importante: FILTER itera fila por fila, lo que lo hace más lento que los filtros CALCULATE simples en tablas grandes. Utilícelo sólo cuando un filtro de columna directo sea insuficiente.

3. TODOS: eliminar todos los filtros

TODOS elimina todos los filtros de una tabla o columna y devuelve la tabla completa sin filtrar. Se utiliza para calcular totales, porcentajes del total y proporciones.

Sintaxis: ALL(table) o ALL(table[column])

Ejemplo: Ingresos como porcentaje del total

Revenue % of Total =
DIVIDE(
    SUM(Sales[Revenue]),
    CALCULATE(SUM(Sales[Revenue]), ALL(Sales))
)

Cuando una segmentación filtra a "Norteamérica", SUM(Sales[Revenue]) devuelve los ingresos de Norteamérica. CALCULATE(SUM(Sales[Revenue]), ALL(Sales)) elimina todos los filtros y devuelve ingresos globales. La división da el porcentaje.

4. ALLEXCEPT: eliminar todos los filtros excepto los especificados

ALLEXCEPT elimina todos los filtros de una tabla excepto las columnas especificadas. Esto es útil cuando desea conservar algunos filtros (como el año) y eliminar otros (como la categoría de producto).

Sintaxis: ALLEXCEPT(table, column1, column2, ...)

Ejemplo: participación en los ingresos del año en curso

Revenue % of Year Total =
DIVIDE(
    SUM(Sales[Revenue]),
    CALCULATE(
        SUM(Sales[Revenue]),
        ALLEXCEPT(Sales, DateTable[Year])
    )
)

Esto muestra la participación de ingresos de cada producto o región dentro del año seleccionado, no en todo el tiempo.

5. TOTALYTD — En lo que va del año

TOTALYTD calcula un total acumulado desde el inicio del año hasta la fecha actual en contexto.

Sintaxis: TOTALYTD(expression, dates[date_column], [filter], [year_end_date])

Ejemplo: ingresos del año hasta la fecha

Revenue YTD =
TOTALYTD(SUM(Sales[Revenue]), DateTable[Date])

Con año fiscal que finaliza el 30 de junio:

Revenue Fiscal YTD =
TOTALYTD(SUM(Sales[Revenue]), DateTable[Date], "6/30")

Requisito previo: La tabla de fechas debe estar marcada como una tabla de fechas en el modelo (Herramientas de tabla, luego Marcar como tabla de fechas).

6. MISMOPERIODÚLTIMO AÑO: año tras año

SAMEPERIODLASTYEAR desplaza el contexto de la fecha exactamente un año atrás.

Sintaxis: SAMEPERIODLASTYEAR(dates[date_column])

Ejemplo: ingresos en comparación con el año pasado

Revenue PY =
CALCULATE(SUM(Sales[Revenue]), SAMEPERIODLASTYEAR(DateTable[Date]))

Revenue YoY Growth =
VAR CurrentRevenue = SUM(Sales[Revenue])
VAR PriorRevenue = [Revenue PY]
RETURN
DIVIDE(CurrentRevenue - PriorRevenue, PriorRevenue, 0)

En una matriz mensual, cada fila muestra los ingresos del mes actual y del mismo mes del año anterior, junto con el porcentaje de crecimiento.

7. DATEADD - Turnos de horario flexibles

DATEADD cambia las fechas en cualquier intervalo: días, meses, trimestres o años. Es más flexible que SAMEPERIODLASTYEAR.

Sintaxis: DATEADD(dates[date_column], intervals, interval_type)

Ejemplo: ingresos hace 3 meses

Revenue 3 Months Ago =
CALCULATE(
    SUM(Sales[Revenue]),
    DATEADD(DateTable[Date], -3, MONTH)
)

Ejemplo: ingresos acumulables de 12 meses

Revenue Rolling 12M =
CALCULATE(
    SUM(Sales[Revenue]),
    DATESINPERIOD(DateTable[Date], MAX(DateTable[Date]), -12, MONTH)
)

8. RANKX: clasificaciones dinámicas

RANKX asigna una clasificación a cada elemento según una expresión.

Sintaxis: RANKX(table, expression, [value], [order], [ties])

Ejemplo: clasificar productos por ingresos

Product Revenue Rank =
RANKX(
    ALL(Products[ProductName]),
    [Total Revenue],
    ,
    DESC,
    DENSE
)

ALL(Products[ProductName]) proporciona la lista completa de productos para clasificar, independientemente de los filtros de segmentación de productos. DESC significa que los ingresos más altos obtienen el rango 1. DENSE significa que los valores empatados obtienen el mismo rango.

Ejemplo: filtro Top N

Top 10 Products Revenue =
CALCULATE(
    [Total Revenue],
    FILTER(
        ALL(Products[ProductName]),
        RANKX(ALL(Products[ProductName]), [Total Revenue], , DESC) <= 10
    )
)

9. INTERRUPTOR — Lógica condicional

SWITCH reemplaza declaraciones IF anidadas y es mucho más legible.

Sintaxis: SWITCH(expression, value1, result1, value2, result2, ..., else_result)

Ejemplo: clasificación de segmentos de clientes

Customer Segment =
SWITCH(
    TRUE(),
    [Total Revenue] > 100000, "Enterprise",
    [Total Revenue] > 25000, "Mid-Market",
    [Total Revenue] > 5000, "SMB",
    "Startup"
)

Ejemplo: selección de medida dinámica

Selected Measure =
SWITCH(
    SELECTEDVALUE(MeasureSelector[Measure]),
    "Revenue", [Total Revenue],
    "Orders", [Order Count],
    "AOV", [Average Order Value],
    "Margin", [Gross Margin %],
    [Total Revenue]
)

Este patrón funciona con una segmentación de datos que permite a los usuarios elegir qué métrica mostrar en un gráfico.

10. VAR / RETORNO — Variables

Las variables almacenan resultados intermedios, haciendo que las fórmulas sean legibles y evitando cálculos redundantes. Una variable se evalúa una vez y se reutiliza.

Sintaxis: VAR name = expression RETURN final_expression

Ejemplo: KPI complejo con variables

Customer Health Score =
VAR Revenue = [Total Revenue]
VAR OrderCount = [Order Count]
VAR DaysSinceLastOrder =
    DATEDIFF(MAX(Sales[OrderDate]), TODAY(), DAY)
VAR RevenueScore =
    SWITCH(TRUE(), Revenue > 50000, 3, Revenue > 10000, 2, 1)
VAR FrequencyScore =
    SWITCH(TRUE(), OrderCount > 20, 3, OrderCount > 5, 2, 1)
VAR RecencyScore =
    SWITCH(TRUE(), DaysSinceLastOrder < 30, 3, DaysSinceLastOrder < 90, 2, 1)
RETURN
    RevenueScore + FrequencyScore + RecencyScore

Sin variables, esta fórmula repetiría los mismos cálculos varias veces, haciéndola ilegible y más lenta.

11. DIVIDIR - División segura

DIVIDE maneja elegantemente la división por cero y devuelve un resultado alternativo específico en lugar de un error.

Sintaxis: DIVIDE(numerator, denominator, [alternate_result])

Ejemplo:

Conversion Rate =
DIVIDE([Closed Won Deals], [Total Opportunities], 0)

Utilice siempre DIVIDE en lugar del operador / en medidas. El operador / devuelve un error al dividir por cero, lo que altera los elementos visuales.

12. DISTINCTCOUNT: contar valores únicos

DISTINCTCOUNT cuenta el número de valores únicos en una columna.

Sintaxis: DISTINCTCOUNT(column)

Ejemplo: Clientes activos en el periodo

Active Customers =
DISTINCTCOUNT(Sales[CustomerID])

Esto cuenta a los clientes únicos que realizaron al menos una compra en el contexto del filtro actual (mes, trimestre, etc. seleccionados).

13. CONTADORES: contar filas en una tabla

COUNTROWS cuenta el número de filas de una tabla, opcionalmente filtradas.

Sintaxis: COUNTROWS(table)

Ejemplo: recuento de pedidos

Order Count =
COUNTROWS(Sales)

Cancelled Orders =
CALCULATE(
    COUNTROWS(Sales),
    Sales[Status] = "Cancelled"
)

14. SUMX - Suma fila por fila

SUMX es un iterador que evalúa una expresión para cada fila y suma los resultados. Es esencial cuando necesitas multiplicar columnas antes de sumar.

Sintaxis: SUMX(table, expression)

Ejemplo: cálculo del promedio ponderado

Weighted Average Price =
DIVIDE(
    SUMX(Sales, Sales[Quantity] * Sales[UnitPrice]),
    SUM(Sales[Quantity])
)

SUMA no puede multiplicar dos columnas. Necesita SUMX para evaluar Cantidad multiplicada por PrecioUnitario para cada fila y luego sumar los resultados.

15. PROMEDIOX: Promedio fila por fila

AVERAGEX es la versión iteradora de AVERAGE.

Sintaxis: AVERAGEX(table, expression)

Ejemplo: Promedio de días para cerrar

Average Days to Close =
AVERAGEX(
    Opportunities,
    DATEDIFF(Opportunities[CreatedDate], Opportunities[ClosedDate], DAY)
)

16. MAXX y MINX: iterador mínimo/máximo

MAXX y MINX encuentran el valor máximo o mínimo de una expresión evaluada fila por fila.

Ejemplo: última fecha de pedido por cliente

Most Recent Order =
MAXX(Sales, Sales[OrderDate])

Oldest Unpaid Invoice =
MINX(
    FILTER(Invoices, Invoices[PaymentStatus] = "Unpaid"),
    Invoices[InvoiceDate]
)

17. VALOR DE BÚSQUEDA: equivalente a BUSCARV

LOOKUPVALUE recupera un valor de una tabla según uno o más criterios de búsqueda. Es el equivalente DAX de BUSCARV de Excel.

Sintaxis: LOOKUPVALUE(result_column, search_column, search_value, ...)

Ejemplo:

Customer Region =
LOOKUPVALUE(
    Customers[Region],
    Customers[CustomerID], Sales[CustomerID]
)

Nota: LOOKUPVALUE se utiliza normalmente en columnas calculadas, no en medidas. En medidas, se prefieren RELATION (para muchos a uno) o RELATIONTABLE (para uno a muchos).

18. SELECTEDVALUE: obtenga el valor de segmentación actual

SELECTEDVALUE devuelve el valor de una columna cuando exactamente un valor está en el contexto del filtro. Si se seleccionan varios valores, devuelve el resultado alternativo.

Sintaxis: SELECTEDVALUE(column, [alternate_result])

Ejemplo: título dinámico

Chart Title =
"Revenue for " & SELECTEDVALUE(DateTable[Year], "All Years")

19. ES EN BLANCO: comprobar si hay valores vacíos

ISBLANK prueba si un valor está en blanco (nulo/vacío).

Ejemplo: Pedidos sin vendedor asignado

Unassigned Orders =
CALCULATE(
    COUNTROWS(Sales),
    ISBLANK(Sales[SalespersonID])
)

20. CONCATENATEX: concatenar valores de una tabla

CONCATENATEX itera sobre una tabla y concatena valores en una sola cadena.

Sintaxis: CONCATENATEX(table, expression, [delimiter], [order_by], [order])

Ejemplo: Lista de productos comprados por un cliente

Products Purchased =
CONCATENATEX(
    VALUES(Products[ProductName]),
    Products[ProductName],
    ", ",
    Products[ProductName], ASC
)

En una tabla de detalles del cliente, esto muestra "Producto A, Producto B, Producto C" para cada cliente.


Análisis profundo de la inteligencia del tiempo

La inteligencia temporal es la razón más común por la que los usuarios empresariales necesitan DAX. Las funciones de inteligencia temporal de Power BI requieren una tabla de fechas dedicada. Aquí hay un conjunto completo de medidas de tiempo.

Requisitos previos: la tabla de fechas

Tu modelo debe tener una tabla de fechas con:

  • Una columna de fecha continua (sin espacios) que cubre todo el rango de datos
  • La tabla marcada como tabla de fechas (Herramientas de tabla, luego Marcar como tabla de fechas)
  • Una relación entre la columna de fecha de la tabla de fechas y la columna de fecha de cada tabla de hechos

Medidas de inteligencia de tiempo común

-- Month-to-Date
Revenue MTD =
TOTALMTD(SUM(Sales[Revenue]), DateTable[Date])

-- Quarter-to-Date
Revenue QTD =
TOTALQTD(SUM(Sales[Revenue]), DateTable[Date])

-- Year-to-Date
Revenue YTD =
TOTALYTD(SUM(Sales[Revenue]), DateTable[Date])

-- Previous Month
Revenue PM =
CALCULATE(SUM(Sales[Revenue]), PREVIOUSMONTH(DateTable[Date]))

-- Previous Quarter
Revenue PQ =
CALCULATE(SUM(Sales[Revenue]), PREVIOUSQUARTER(DateTable[Date]))

-- Previous Year
Revenue PY =
CALCULATE(SUM(Sales[Revenue]), PREVIOUSYEAR(DateTable[Date]))

-- Month-over-Month Growth
Revenue MoM % =
VAR Current = SUM(Sales[Revenue])
VAR Prior = [Revenue PM]
RETURN DIVIDE(Current - Prior, Prior, 0)

-- Year-over-Year Growth
Revenue YoY % =
VAR Current = SUM(Sales[Revenue])
VAR Prior = [Revenue PY]
RETURN DIVIDE(Current - Prior, Prior, 0)

-- Rolling 3-Month Average
Revenue 3M Avg =
AVERAGEX(
    DATESINPERIOD(DateTable[Date], MAX(DateTable[Date]), -3, MONTH),
    CALCULATE(SUM(Sales[Revenue]))
)

-- Cumulative Total (Running Sum)
Revenue Cumulative =
CALCULATE(
    SUM(Sales[Revenue]),
    FILTER(
        ALL(DateTable[Date]),
        DateTable[Date] <= MAX(DateTable[Date])
    )
)

Inteligencia del tiempo del año fiscal

Si su año fiscal no se alinea con el año calendario, use el parámetro opcional Year_end_date:

-- Fiscal Year ending March 31
Revenue Fiscal YTD =
TOTALYTD(SUM(Sales[Revenue]), DateTable[Date], "3/31")

-- Or use DATESYTD for more control
Revenue Fiscal YTD v2 =
CALCULATE(
    SUM(Sales[Revenue]),
    DATESYTD(DateTable[Date], "3/31")
)

Transición de contexto: el motor oculto

La transición de contexto es el proceso en el que el contexto de la fila (de una columna calculada o un iterador) se convierte en un contexto de filtro cuando se llama a una medida. Este es el concepto más poderoso e incomprendido de DAX.

Cómo funciona

Considere esta medida:

Total Revenue = SUM(Sales[Revenue])

Y esta columna calculada en la tabla Productos:

Product Revenue = [Total Revenue]

En la columna calculada, hay un contexto de fila (la fila del producto actual). Cuando se llama a [Total Revenue], la transición de contexto convierte el contexto de la fila en un filtro: CALCULATE(SUM(Sales[Revenue]), Products[ProductID] = <current row's ProductID>). El resultado son ingresos para ese producto específico.

Implicaciones de rendimiento

La transición de contexto agrega un CALCULATE implícito alrededor de la llamada de medida. En mesas pequeñas esto es insignificante. Para mesas grandes y con medidas complejas, puede resultar caro. Evite llamar a medidas complejas dentro de iteradores en tablas grandes.

Ineficiente:

-- Iterates over every customer, calling a complex measure each time
Customer Profitability =
SUMX(
    Customers,
    [Revenue] - [COGS] - [Allocated Overhead]
)

Mejor:

-- Pre-compute the components and use simple arithmetic
Customer Profitability =
SUM(Sales[Revenue]) - SUM(Sales[COGS]) -
DIVIDE(SUM(Sales[Revenue]), [Total Revenue]) * [Total Overhead]

Escenarios prácticos de negocios

Escenario 1: Análisis ABC (Clasificación de Pareto)

Clasifique los productos en A (80% superior de los ingresos), B (15% siguiente) y C (5% inferior):

ABC Class =
VAR CurrentProduct = SELECTEDVALUE(Products[ProductName])
VAR AllProducts =
    ADDCOLUMNS(
        ALL(Products[ProductName]),
        "@Revenue", [Total Revenue]
    )
VAR Sorted = TOPN(COUNTROWS(AllProducts), AllProducts, [@Revenue], DESC)
VAR TotalRev = SUMX(AllProducts, [@Revenue])
VAR CumulativeRev =
    SUMX(FILTER(Sorted, [@Revenue] >= [Total Revenue]), [@Revenue])
VAR CumulativePct = DIVIDE(CumulativeRev, TotalRev)
RETURN
    SWITCH(TRUE(),
        CumulativePct <= 0.8, "A",
        CumulativePct <= 0.95, "B",
        "C"
    )

Escenario 2: Análisis de retención de cohortes

Realice un seguimiento de cuántos clientes de cada cohorte de adquisición permanecen activos a lo largo del tiempo:

Cohort Retention Rate =
VAR CohortMonth = SELECTEDVALUE(DateTable[YearMonth])
VAR CohortCustomers =
    CALCULATE(
        DISTINCTCOUNT(Sales[CustomerID]),
        FILTER(
            ALL(Sales),
            FORMAT(Sales[FirstPurchaseDate], "YYYY-MM") = CohortMonth
        )
    )
VAR ActiveCustomers =
    CALCULATE(
        DISTINCTCOUNT(Sales[CustomerID]),
        FILTER(
            ALL(Sales),
            FORMAT(Sales[FirstPurchaseDate], "YYYY-MM") = CohortMonth
        )
    )
RETURN
    DIVIDE(ActiveCustomers, CohortCustomers, 0)

Escenario 3: Total anual móvil (MAT)

Un total anual móvil suaviza la estacionalidad sumando los últimos 12 meses completos:

Revenue MAT =
CALCULATE(
    SUM(Sales[Revenue]),
    DATESINPERIOD(DateTable[Date], MAX(DateTable[Date]), -12, MONTH)
)

Revenue MAT Growth =
VAR Current = [Revenue MAT]
VAR Prior =
    CALCULATE(
        [Revenue MAT],
        DATEADD(DateTable[Date], -12, MONTH)
    )
RETURN
    DIVIDE(Current - Prior, Prior, 0)

Iterador vs Agregador: cuándo usar cada uno

Funciones de agregación

SUM, AVERAGE, COUNT, MIN, MAX operan en una sola columna. Son rápidos porque el motor de almacenamiento puede resolverlos directamente a partir de datos de columnas comprimidos.

Úselo cuando: Necesita una agregación simple de una columna.

Funciones de iterador

SUMX, AVERAGEX, COUNTX, MINX, MAXX, RANKX evalúan una expresión fila por fila. Son más flexibles pero más lentos porque el motor de fórmulas procesa cada fila.

Usar cuando:

  • Es necesario multiplicar las columnas antes de agregarlas (SUMX para cálculos ponderados)
  • Es necesario aplicar una condición por fila (COUNTX con IF)
  • Necesitas clasificar los artículos (RANKX)
  • El cálculo depende de valores de tablas relacionadas que necesitan evaluación a nivel de fila

Regla general de rendimiento: Si se puede lograr el mismo resultado con un agregador, utilícelo. Utilice iteradores únicamente cuando sea necesaria la evaluación fila por fila.


Depuración de DAX

Mensajes de error comunes

ErrorCausaArreglar
"Se espera un valor único para la columna X"La medida devuelve múltiples valores donde se espera unoUtilice SELECTEDVALUE, MAX o CALCULATE para reducir a un valor
"Dependencia circular"Dos columnas o medidas calculadas se hacen referencia entre síRediseñar la cadena de cálculo para eliminar el ciclo
"No se pueden determinar las relaciones"Ruta de relación ambigua entre tablasEspecifique la relación en USERELATIONSHIP o actívela
"La expresión hace referencia a varias columnas"TODOS/VALORES utilizados con varias columnas incorrectamenteUtilice TODOS(Tabla) o TODOS(Tabla[Col1], Tabla[Col2])

Analizador de rendimiento

El Analizador de rendimiento de Power BI Desktop (Ver y luego Analizador de rendimiento) muestra la consulta DAX y el tiempo de ejecución de cada objeto visual. Úselo para:

  1. Identifique imágenes lentas (más de 1 segundo)
  2. Copie la consulta DAX a DAX Studio para un análisis detallado
  3. Compare los tiempos de ejecución antes/después al optimizar medidas

Estudio DAX

DAX Studio es una herramienta externa gratuita que proporciona un análisis de consultas detallado. Muestra:

  • Consultas del motor de almacenamiento (escaneos rápidos de almacén de columnas)
  • Consultas del motor de fórmulas (evaluación fila por fila más lenta)
  • Tamaños de materialización (datos mezclados entre motores)

Si una medida genera muchas consultas del motor de fórmulas, es probable que utilice demasiados iteradores o expresiones FILTER complejas. Refactorice para enviar más trabajo al motor de almacenamiento.

Para capacitación en Power BI que cubre DAX desde los fundamentos hasta la optimización avanzada, ECOSIRE ofrece talleres prácticos adaptados a sus conjuntos de datos y preguntas comerciales específicos.


Preguntas frecuentes

¿Cuál es la diferencia entre una medida y una columna calculada?

Una medida se evalúa en el momento de la consulta dentro del contexto de filtro actual. No agrega datos a la tabla; calcula un valor dinámicamente. Una columna calculada se evalúa en el momento de la actualización de datos y agrega una columna física a la tabla. Utilice medidas para agregaciones y KPI que cambien según las segmentaciones y los filtros. Utilice columnas calculadas para clasificaciones o valores a nivel de fila que deban usarse en segmentaciones, filtros o relaciones. Casi siempre se prefieren las medidas porque no aumentan el tamaño del modelo.

¿Por qué mi medida YTD muestra valores incorrectos?

La causa más común es que su tabla de fechas no está configurada correctamente. Verifique tres cosas: (1) la tabla de fechas no tiene espacios: se deben incluir todas las fechas desde el inicio de sus datos hasta el presente, (2) la tabla está marcada como una tabla de fechas en Power BI (Herramientas de tabla, luego Marcar como tabla de fechas) y (3) la relación entre la tabla de fechas y su tabla de hechos está activa y asignada correctamente. También verifique que su columna de fecha no incluya un componente de tiempo que impida la coincidencia exacta.

¿Cuándo debo usar CALCULAR versus FILTRAR?

Utilice CALCULATE cuando pueda expresar el filtro como una simple comparación de columnas (por ejemplo, Products[Category] = "Electronics"). CALCULATE convierte esto en un filtro eficiente que el motor de almacenamiento puede optimizar. Utilice FILTRO cuando necesite condiciones complejas fila por fila que hagan referencia a varias columnas o llamen a medidas (por ejemplo, filtrar clientes donde CALCULATE(COUNTROWS(Sales)) > 5). FILTER es un iterador y es más lento, así que prefiera la sintaxis simple de CALCULATE cuando sea posible.

¿Cómo creo un total acumulado o una suma acumulada en DAX?

Utilice CALCULATE con un filtro que incluya todas las fechas hasta la fecha actual: Revenue Cumulative = CALCULATE(SUM(Sales[Revenue]), FILTER(ALL(DateTable[Date]), DateTable[Date] <= MAX(DateTable[Date]))). Esto elimina el filtro de fecha existente (TODOS) y lo reemplaza con un filtro que incluye todas las fechas desde el principio hasta la fecha máxima en el contexto actual. En una matriz mensual, cada fila muestra el total acumulado hasta ese mes.

¿Puedo usar DAX para volver a escribir datos en la base de datos?

No. DAX es un lenguaje de consulta de solo lectura. Puede calcular, filtrar y transformar datos para mostrarlos, pero no puede insertar, actualizar ni eliminar datos en la base de datos de origen. Para escenarios de reescritura, use Power Apps integrado en Power BI o use flujos de Power Automate desencadenados por alertas de Power BI. Algunas herramientas de terceros (Acterys, Writeback Manager) agregan capacidades de reescritura a través de elementos visuales personalizados.

E

Escrito por

ECOSIRE Research and Development Team

Construyendo productos digitales de nivel empresarial en ECOSIRE. Compartiendo perspectivas sobre integraciones Odoo, automatización de eCommerce y soluciones empresariales impulsadas por IA.

Chatea en whatsapp