Menu
CoddyTech

Hoja de trucos de Power BI

Última actualización

Aprende Power BI gratis

Medidas, columnas y tablas

Una medida se calcula para cada celda de un objeto visual; una columna calculada se calcula una vez por fila y se guarda.

Qué haceDAX
Crear una medidaTotal Sales = SUM ( Sales[Amount] )
Crear una columna calculada (un valor por fila)Line Total = Sales[Quantity] * Sales[Unit Price]
Crear una tabla calculadaTop Customers = TOPN ( 10, Customer, [Total Sales] )
Hacer referencia a una columna: el nombre de la tabla y luego la columna entre corchetesSales[Amount]
Poner entre comillas un nombre de tabla que tiene un espacio o es una palabra reservada'Date'[Date]
Hacer referencia a una medida: solo corchetes[Total Sales]
Usar una medida dentro de otra medidaAverage Price = DIVIDE ( [Total Sales], [Total Units] )

Funciones de agregación

Cada una resume una columna en el contexto de filtro actual.

Qué haceDAX
Sumar una columnaSUM ( Sales[Amount] )
Promedio de una columnaAVERAGE ( Sales[Amount] )
Valor más pequeñoMIN ( Sales[Order Date] )
Valor más grandeMAX ( Sales[Order Date] )
Contar las filas de una tablaCOUNTROWS ( Sales )
Contar los valores de una columna que no están en blancoCOUNT ( Sales[Amount] )
Contar valores distintosDISTINCTCOUNT ( Sales[Customer Key] )
Dividir sin riesgo: un valor en blanco en vez de un error cuando el divisor es 0DIVIDE ( [Total Sales], [Total Units] )
Dividir con un valor que mostrar cuando el divisor es 0DIVIDE ( [Profit], [Total Sales], 0 )

Iteradores (las funciones X)

Recorren una tabla fila por fila, evalúan una expresión en cada fila y luego agregan los resultados.

Qué haceDAX
Multiplicar por fila y luego sumarSUMX ( Sales, Sales[Quantity] * Sales[Unit Price] )
Promedio de un resultado por filaAVERAGEX ( Sales, Sales[Quantity] * Sales[Unit Price] )
Mayor resultado por filaMAXX ( Sales, Sales[Quantity] * Sales[Unit Price] )
Promedio de una medida por clienteAVERAGEX ( VALUES ( Customer[Customer Key] ), [Total Sales] )
Usar una columna de una tabla relacionada en la expresiónSUMX ( Sales, Sales[Quantity] * RELATED ( Product[Unit Cost] ) )
Contar las filas que cumplen una condiciónCOUNTROWS ( FILTER ( Sales, Sales[Quantity] >= 3 ) )
Clasificar cada producto según una medidaRANKX ( ALL ( Product[Product] ), [Total Sales] )
Clasificar sin huecos tras los empates (1, 1, 2)RANKX ( ALL ( Product[Product] ), [Total Sales], , DESC, DENSE )
Unir valores en un solo textoCONCATENATEX ( VALUES ( Product[Category] ), Product[Category], ", " )

CALCULATE y funciones de filtro

CALCULATE evalúa una expresión con los filtros cambiados. Un filtro sobre la misma columna sustituye al anterior; los filtros sobre columnas distintas se combinan con AND.

Qué haceDAX
Filtrar por un valorCALCULATE ( [Total Sales], Product[Category] = "Bikes" )
Filtrar por una lista de valoresCALCULATE ( [Total Sales], Product[Color] IN { "Red", "Blue" } )
Dos filtros (AND)CALCULATE ( [Total Sales], Product[Color] = "Red", Store[Country] = "Spain" )
OR entre dos columnasCALCULATE ( [Total Sales], FILTER ( ALL ( Product[Color], Product[Brand] ), Product[Color] = "Red" || Product[Brand] = "Contoso" ) )
Filtrar por una medidaCALCULATE ( [Total Sales], FILTER ( VALUES ( Customer[Customer Key] ), [Total Sales] > 1000 ) )
Mantener el filtro existente y cruzarlo con el nuevoCALCULATE ( [Total Sales], KEEPFILTERS ( Product[Color] IN { "Red", "Blue" } ) )
Quitar los filtros de una columnaCALCULATE ( [Total Sales], REMOVEFILTERS ( Product[Category] ) )
Quitar todos los filtros de una tablaCALCULATE ( [Total Sales], ALL ( Product ) )
Quitar todos los filtros de una tabla salvo algunas columnasCALCULATE ( [Total Sales], ALLEXCEPT ( Store, Store[Country] ) )
Mantener la selección de las segmentaciones e ignorar las filas del propio objeto visualCALCULATE ( [Total Sales], ALLSELECTED ( Product[Category] ) )
Usar una relación inactivaCALCULATE ( [Total Sales], USERELATIONSHIP ( Sales[Ship Date], 'Date'[Date] ) )
Hacer que un filtro fluya en ambas direcciones para una medidaCALCULATE ( COUNTROWS ( Customer ), CROSSFILTER ( Sales[Customer Key], Customer[Customer Key], BOTH ) )
Filtrar con una tabla que no tiene relaciónCALCULATE ( [Total Sales], TREATAS ( VALUES ( Budget[Category] ), Product[Category] ) )

Inteligencia de tiempo

Necesitan una tabla de fechas: una fila por día, sin huecos y marcada como tabla de fechas.

Qué haceDAX
Acumulado del añoTOTALYTD ( [Total Sales], 'Date'[Date] )
Acumulado del año, con un año fiscal que termina el 30 de junioTOTALYTD ( [Total Sales], 'Date'[Date], "6/30" )
Acumulado del año dentro de CALCULATECALCULATE ( [Total Sales], DATESYTD ( 'Date'[Date] ) )
Acumulado del trimestreTOTALQTD ( [Total Sales], 'Date'[Date] )
Acumulado del mesTOTALMTD ( [Total Sales], 'Date'[Date] )
Mismo periodo del año anteriorCALCULATE ( [Total Sales], SAMEPERIODLASTYEAR ( 'Date'[Date] ) )
Desplazar las fechas un intervalo (aquí, un mes atrás)CALCULATE ( [Total Sales], DATEADD ( 'Date'[Date], -1, MONTH ) )
El mes anterior completoCALCULATE ( [Total Sales], PREVIOUSMONTH ( 'Date'[Date] ) )
El periodo completo un año atrásCALCULATE ( [Total Sales], PARALLELPERIOD ( 'Date'[Date], -1, YEAR ) )
Los últimos 12 meses hasta la última fecha visibleCALCULATE ( [Total Sales], DATESINPERIOD ( 'Date'[Date], MAX ( 'Date'[Date] ), -12, MONTH ) )
Un rango de fechas fijoCALCULATE ( [Total Sales], DATESBETWEEN ( 'Date'[Date], DATE ( 2025, 1, 1 ), DATE ( 2025, 3, 31 ) ) )

Patrones de medidas comunes

Cópialos y cambia los nombres de tablas y columnas para que coincidan con tu modelo.

Qué haceDAX
Porcentaje sobre todas las categoríasCategory % = DIVIDE ( [Total Sales], CALCULATE ( [Total Sales], REMOVEFILTERS ( Product[Category] ) ) )
Porcentaje sobre lo que dejan las segmentacionesVisible % = DIVIDE ( [Total Sales], CALCULATE ( [Total Sales], ALLSELECTED ( Product[Category] ) ) )
Crecimiento interanualYoY % = VAR LastYear = CALCULATE ( [Total Sales], SAMEPERIODLASTYEAR ( 'Date'[Date] ) ) RETURN DIVIDE ( [Total Sales] - LastYear, LastYear )
Total acumulado desde el principioRunning Total = CALCULATE ( [Total Sales], FILTER ( ALL ( 'Date'[Date] ), 'Date'[Date] <= MAX ( 'Date'[Date] ) ) )
Media móvil de 7 días (por día con ventas)Sales 7 Day Avg = AVERAGEX ( DATESINPERIOD ( 'Date'[Date], MAX ( 'Date'[Date] ), -7, DAY ), [Total Sales] )
Mostrar un valor solo para los 5 primerosTop 5 Sales = IF ( RANKX ( ALLSELECTED ( Product[Product] ), [Total Sales] ) <= 5, [Total Sales] )
Contar los clientes por encima de un umbralBig Customers = COUNTROWS ( FILTER ( VALUES ( Customer[Customer Key] ), [Total Sales] > 1000 ) )
Hacer que un total sume sus filasBonus Total = SUMX ( VALUES ( Product[Category] ), [Bonus] )
Mostrar un valor solo en un nivel de una matrizCategory Rank = IF ( ISINSCOPE ( Product[Category] ), RANKX ( ALL ( Product[Category] ), [Total Sales] ) )
Saldo de cierre: la última fecha que tiene un valorClosing Units = CALCULATE ( SUM ( Inventory[Units] ), LASTNONBLANK ( 'Date'[Date], CALCULATE ( SUM ( Inventory[Units] ) ) ) )

Funciones lógicas y de información

Para condiciones y para saber qué contiene el contexto de filtro.

Qué haceDAX
Una condiciónIF ( [Total Sales] > 1000, "High", "Low" )
Varios valores de una expresiónSWITCH ( Store[Country], "Spain", "ES", "Portugal", "PT", "Other" )
Rangos, comprobados de arriba abajoSWITCH ( TRUE (), [Total Sales] >= 10000, "A", [Total Sales] >= 1000, "B", "C" )
AND y ORIF ( Sales[Quantity] > 2 && Sales[Amount] > 50, "Big", "Small" )
¿El valor está en blanco?ISBLANK ( [Total Sales] )
Primer valor que no está en blancoCOALESCE ( [Total Sales], 0 )
¿El filtro deja exactamente un valor?HASONEVALUE ( Product[Category] )
Ese único valor, o uno predeterminadoSELECTEDVALUE ( Product[Category], "All categories" )
¿Esta fila del objeto visual está agrupada por la columna?ISINSCOPE ( Product[Category] )
Devolver un valor en blancoBLANK ()

Funciones de texto

El operador & une texto; FORMAT convierte un número o una fecha en texto.

Qué haceDAX
Unir textoCustomer[First Name] & " " & Customer[Last Name]
Dar formato a un númeroFORMAT ( [Total Sales], "#,0.00" )
Dar formato a una fechaFORMAT ( 'Date'[Date], "mmm yyyy" )
Primeros caracteresLEFT ( Product[Code], 3 )
Caracteres desde una posiciónMID ( Product[Code], 4, 2 )
LongitudLEN ( Product[Name] )
MayúsculasUPPER ( Store[City] )
Quitar espacios sobrantesTRIM ( Customer[Name] )
Reemplazar textoSUBSTITUTE ( Customer[Phone], " ", "" )
Posición de un texto, sin distinguir mayúsculas (0 si no aparece)SEARCH ( "pro", Product[Name], 1, 0 )

Funciones de fecha

Por debajo, las fechas son números, así que puedes restarlas para obtener días.

Qué haceDAX
La fecha de hoyTODAY ()
Construir una fechaDATE ( 2025, 12, 31 )
Año de una fechaYEAR ( 'Date'[Date] )
Número del mesMONTH ( 'Date'[Date] )
Día de la semana, con el lunes como 1WEEKDAY ( 'Date'[Date], 2 )
Número de semana, con semanas que empiezan el lunesWEEKNUM ( 'Date'[Date], 2 )
Último día del mesEOMONTH ( 'Date'[Date], 0 )
El mismo día un mes antesEDATE ( 'Date'[Date], -1 )
Días entre dos fechasDATEDIFF ( Sales[Order Date], Sales[Ship Date], DAY )
Una tabla de fechas a partir de fechas fijasCALENDAR ( DATE ( 2024, 1, 1 ), DATE ( 2025, 12, 31 ) )
Una tabla de fechas a partir de las fechas del modeloCALENDARAUTO ()

Relaciones y búsquedas

RELATED sigue una relación desde el lado de muchos hasta el lado de uno.

Qué haceDAX
Valor del lado de uno (en una columna de Sales)RELATED ( Product[Category] )
Las filas del lado de muchos de la fila actual (en una columna de Customer)COUNTROWS ( RELATEDTABLE ( Sales ) )
Buscar un valor sin relaciónLOOKUPVALUE ( Product[Price], Product[SKU], Sales[SKU] )
Ruta padre e hijo (para jerarquías y seguridad de nivel de fila)PATH ( Employee[Employee ID], Employee[Manager ID] )
El usuario que ha iniciado sesión, para la seguridad dinámica de nivel de filaUSERPRINCIPALNAME ()

Funciones de tabla

Devuelven tablas: úsalas en una tabla calculada, dentro de CALCULATE o en un iterador.

Qué haceDAX
Valores distintos en el filtro actualVALUES ( Product[Category] )
Filas que cumplen una condiciónFILTER ( Product, Product[Price] > 100 )
Las N primeras filas según una medidaTOPN ( 5, ALL ( Product[Product] ), [Total Sales] )
Agrupar por columnas y añadir medidasSUMMARIZECOLUMNS ( Product[Category], "Sales", [Total Sales] )
Añadir una columna a una tablaADDCOLUMNS ( VALUES ( Product[Category] ), "Sales", [Total Sales] )
Elegir columnas y cambiarles el nombreSELECTCOLUMNS ( Customer, "Name", Customer[Name], "City", Customer[City] )
Una lista de númerosGENERATESERIES ( 1, 10, 1 )
Todas las combinaciones de dos tablasCROSSJOIN ( VALUES ( 'Date'[Year] ), VALUES ( Product[Category] ) )
Apilar dos tablas con las mismas columnasUNION ( 'Sales 2024', 'Sales 2025' )

Variables

VAR da nombre a un paso y lo calcula una sola vez; RETURN devuelve el resultado.

Qué haceDAX
Una variableMargin % = VAR Revenue = [Total Sales] RETURN DIVIDE ( Revenue - [Total Cost], Revenue )
Varias variablesSales vs LY = VAR CY = [Total Sales] VAR PY = CALCULATE ( [Total Sales], SAMEPERIODLASTYEAR ( 'Date'[Date] ) ) RETURN CY - PY
Una tabla en una variableTop 5 Total = VAR Top5 = TOPN ( 5, ALL ( Product[Product] ), [Total Sales] ) RETURN CALCULATE ( [Total Sales], Top5 )

Pasos de Power Query (M)

Power Query da forma a los datos antes de cargarlos. Estas son las fórmulas M que hay detrás de los botones más comunes.

Qué haceM
Conservar las filas que coincidenTable.SelectRows(Source, each [Status] = "Paid")
Quitar columnasTable.RemoveColumns(Source, {"Notes", "Temp"})
Definir los tipos de columnaTable.TransformColumnTypes(Source, {{"Amount", type number}, {"Date", type date}})
Cambiar el nombre de una columnaTable.RenameColumns(Source, {{"amt", "Amount"}})
Agregar una columnaTable.AddColumn(Source, "Total", each [Quantity] * [Price], type number)
Combinar (join) dos consultasTable.NestedJoin(Sales, {"ProductID"}, Products, {"ProductID"}, "Product", JoinKind.LeftOuter)
Anexar (apilar) consultasTable.Combine({Sales2024, Sales2025})
Anular la dinamización de columnas para pasarlas a filasTable.UnpivotOtherColumns(Source, {"Product"}, "Month", "Amount")
Agrupar y agregarTable.Group(Source, {"Category"}, {{"Sales", each List.Sum([Amount]), type number}})
Reemplazar los errores por un valorTable.ReplaceErrorValues(Source, {{"Amount", 0}})

Esta hoja de trucos de Power BI reúne en una sola página el DAX que más se escribe: agregaciones, los iteradores X, CALCULATE y las funciones que cambian filtros, inteligencia de tiempo, funciones de texto y de fecha, y patrones de medidas que puedes copiar, como el porcentaje del total, el crecimiento interanual y los totales acumulados.

Los ejemplos usan un modelo de ventas con las tablas Sales, Product, Customer y 'Date'; cambia los nombres para que coincidan con los tuyos. El DAX se ha analizado con el motor del curso de Power BI de Coddy, donde puedes escribirlo en un espacio de Power BI en tu navegador y comprobarlo.

Preguntas frecuentes sobre la hoja de trucos de Power BI

¿Esta hoja de trucos de Power BI es gratis?

Sí. Léela aquí o guárdala en marcadores; no hace falta registrarse.

¿Qué diferencia hay entre una medida y una columna calculada?

Una columna calculada se calcula una vez por fila al actualizar y se guarda, así que puedes segmentar por ella. Una medida se calcula para cada celda de un objeto visual, con los filtros de esa celda, y no guarda nada. Los totales y los cocientes van en medidas.

¿Qué hace CALCULATE?

Evalúa una expresión con los filtros cambiados: añade, sustituye o quita filtros y luego calcula el resultado. Casi todo el DAX que va más allá de los totales simples es CALCULATE con los argumentos de filtro adecuados.

¿Por qué usar DIVIDE en lugar del operador /?
DIVIDE devuelve un valor en blanco (o el valor que elijas) cuando el divisor es cero o está en blanco. El operador / devuelve infinito o un valor de error, que aparece en los objetos visuales.
¿Necesito una tabla de fechas para la inteligencia de tiempo?
Sí. Funciones como TOTALYTD y SAMEPERIODLASTYEAR necesitan una tabla con una fila por día, sin huecos y con años completos, relacionada con tus tablas de hechos y marcada como tabla de fechas.
¿Este DAX funciona en Power Pivot de Excel y en Analysis Services?

El lenguaje DAX es el mismo, así que casi todo funciona también allí. Algunas funciones más nuevas llegan antes a Power BI.

¿Dónde puedo practicar DAX?

En el curso de Power BI de Coddy: cada lección te da un espacio de Power BI en el navegador y comprueba tu medida con los datos de la lección y con copias ocultas de ellos.

Ilustración de los lenguajes de programación de Coddy

Aprende Power BI con Coddy

Comenzar