Parte de nuestra serie Data Analytics & BI
Leer la guía completaFó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
| Error | Causa | Arreglar |
|---|---|---|
| "Se espera un valor único para la columna X" | La medida devuelve múltiples valores donde se espera uno | Utilice 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 tablas | Especifique la relación en USERELATIONSHIP o actívela |
| "La expresión hace referencia a varias columnas" | TODOS/VALORES utilizados con varias columnas incorrectamente | Utilice 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:
- Identifique imágenes lentas (más de 1 segundo)
- Copie la consulta DAX a DAX Studio para un análisis detallado
- 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.
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.
Artículos relacionados
Funciones de IA de Power BI: Copilot, AutoML y análisis predictivo
Domine las funciones de IA de Power BI, que incluyen Copilot para informes en lenguaje natural, AutoML para predicciones, detección de anomalías y narrativas inteligentes. Guía de licencias.
Guía completa para el desarrollo de paneles de Power BI
Aprenda a crear paneles de Power BI eficaces con diseño de KPI, prácticas recomendadas visuales, páginas de acceso a detalles, marcadores, diseños móviles y seguridad RLS.
Modelado de datos de Power BI: diseño de esquemas en estrella para inteligencia empresarial
Domine el modelado de datos de Power BI con diseño de esquemas en estrella, tablas de hechos y dimensiones, medidas DAX, grupos de cálculo, inteligencia temporal y modelos compuestos.
Más de Data Analytics & BI
Guía completa para el desarrollo de paneles de Power BI
Aprenda a crear paneles de Power BI eficaces con diseño de KPI, prácticas recomendadas visuales, páginas de acceso a detalles, marcadores, diseños móviles y seguridad RLS.
Power BI Embedded: agregar análisis a su aplicación
Incorpore análisis de Power BI en su aplicación SaaS. Cubre autenticación, RLS multiinquilino, tamaño de capacidad, SDK de JavaScript, temas personalizados y precios de Fabric.
Migración de Excel a Power BI: guía paso a paso
Guía completa para migrar de Excel a Power BI que cubre la traducción de fórmulas, la creación de modelos de datos, Power Query, la validación y el desmantelamiento.
La guía completa para la integración de Power BI + Odoo
Conecte Power BI a Odoo ERP para realizar análisis avanzados. Consultas directas de PostgreSQL, tablas clave, paneles de ventas/inventario/RRHH y configuración de actualización incremental.
Medición del ROI de la IA en las empresas: un marco que realmente funciona
Un marco práctico para medir el retorno de la inversión en IA que cubre ahorros directos, ganancias de productividad, impacto en los ingresos y valor estratégico en todos los departamentos.
Creación de paneles de informes financieros: KPI, diseño e integración de ERP
Diseñe paneles de informes financieros que impulsen las decisiones. Descubra qué KPI realizar un seguimiento, principios de diseño de paneles y mejores prácticas de integración de ERP.