Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
DAX
P á g i n a 1 | 55
INDICE
P á g i n a 3 | 55
FUNCIONES DE FECHA Y HORA.
Muchas de las funciones de fecha y hora en DAX son muy similares a las funciones de
fecha y hora de Excel. No obstante, las funciones DAX pueden usar los valores de una
columna como argumento.
DATE
DAY
MONTH
YEAR
HOUR
MINUTE
SECOND
EDATE
NOW
TODAY
WEEKDAY
WEEKNUM
P á g i n a 4 | 55
Función DATE
Devuelve la fecha especificada pasados como argumentos el año, el mes y el día como
números enteros.
=DATE(año;mes;día)
año Número que representa el año. Puede incluir de uno a cuatro dígitos.
Siempre que sea posible, debe usar cuatro dígitos para evitar
resultados no deseados. Por ejemplo, al usar 07 se devuelve 1907
como el valor de año.
mes Número que representa el mes o un cálculo según las siguientes reglas:
día Número que representa el día o un cálculo según las siguientes reglas:
Si escribe un entero mayor que el último día del mes dado, se produce
el siguiente cálculo: la fecha se calcula sumando el valor de día al mes.
Por ejemplo, en la fórmula DATE( 2014, 3, 32), devuelve un valor
equivalente al 1 de abril de 2014, porque se suman 32 días al primero
de marzo, lo que da como resultado el 1 de abril.
P á g i n a 5 | 55
Funciones DAY, MONTH, YEAR, HOUR, MINUTE, SECOND
DAY(fecha)
MONTH(fecha)
YEAR(fecha)
HOUR(fecha)
MINUTE(fecha)
SECOND(fecha)
P á g i n a 6 | 55
P á g i n a 7 | 55
Evidentemente todas estas funciones se pueden utilizar como argumento de funciones
lógicas, se verán más adelante, como por ejemplo en un IF:
P á g i n a 8 | 55
Función EDATE
=EDATE(fecha_inicio; meses)
Devuelven la fecha y hora actuales. La función NOW devuelve la hora exacta mientras que
TODAY devuelve el valor de hora 00:00:00 para todas las fechas.
P á g i n a 9 | 55
Si sabe que una persona nació en 1963, puede usar la fórmula siguiente para buscar la
edad de dicha persona a partir del cumpleaños de este año:
=YEAR(TODAY()) - 1963
Función WEEKDAY
WEEKDAY(fecha; tipo)
P á g i n a 10 | 55
fecha Fecha.
=WEEKDAY([UpdateDate];2)
Función WEEKNUM
WEEKNUM(fecha; tipo)
fecha Fecha.
P á g i n a 11 | 55
que la primera semana es aquella en la que la mayoría de los días (cuatro o más) están en
el nuevo año. Esto significa que en los años en los que hay tres o menos días en la primera
semana de enero, la función WEEKNUM devuelve números de semana que son diferentes
de la definición ISO 8601.
=WEEKNUM([UpdateDate];2)
P á g i n a 12 | 55
FUNCIONES DE TEXTO.
Las Expresiones de análisis de datos (DAX) incluyen un conjunto de funciones de texto que
está basado en la biblioteca de funciones de cadenas de Excel, pero modificadas para
trabajar con tablas y columnas.
BLANK
CONCATENATE / &
EXACT
FIND
LEFT / RIGHT / MID
LEN
LOWER / UPPER
REPT
SUBSTITUTE
TRIM
VALUE
P á g i n a 13 | 55
Función BLANK
=BLANK()
Los valores en blanco no equivalen a valores nulos. Algunas funciones DAX tratan las
celdas en blanco de un modo algo distinto a como lo hace Microsoft Excel. Los valores en
blanco y lo cadenas vacías ("") no siempre son equivalentes, pero algunas operaciones
pueden tratarlos como tales.
=IF([TotalSalesAmount]>22000000;"OK";BLANK())
Función CONCATENATE
=CONCATENATE(texto1; texto2)
P á g i n a 14 | 55
La función CONCATENATE de DAX acepta solo dos argumentos, mientras que la función
CONCATENATE de Excel acepta hasta 255 argumentos. Si necesita concatenar varias
columnas, puede crear una serie de cálculos o, mejor, utilizar el operador de
concatenación (&) para unir todos ellos en una expresión más sencilla.
Si desea usar cadenas de texto directamente, en lugar de usar una referencia de columna,
cada cadena se debe escribir entre comillas dobles.
Función EXACT
Compara dos cadenas de texto y devuelve TRUE si son exactamente iguales y FALSE si no
es así. EXACT distingue entre mayúsculas y minúsculas, pero omite las diferencias de
formato.
=EXACT(texto1; texto2)
P á g i n a 15 | 55
Función FIND
Devuelve la posición inicial de una cadena de texto dentro de otra. FIND distingue
mayúsculas de minúsculas.
texto_a_buscar Texto que desea buscar. Use las comillas dobles (el texto
vacío) para hacer coincidir el primer carácter de
texto_destino.
Por ejemplo: vamos a devolver la posición del texto “line” dentro de la columna
[ChannelName] de la tabla [DimChannel]:
=FIND("line";[ChannelName];1;blank())
P á g i n a 16 | 55
Funciones LEFT, RIGHT y MID
=LEFT(texto; caracteres)
=RIGHT(texto; caracteres)
=MID(texto; posición; caracteres)
Por ejemplo, de la tabla [DimStore] vamos a sacar información parcial sobre la columna
[StorePhone]:
P á g i n a 17 | 55
Función LEN
Devuelve el número de caracteres de una cadena de texto.
=LEN(texto)
P á g i n a 18 | 55
Función REPT
Repite el texto un número determinado de veces. Utilice REPT para llenar una celda con
varias instancias de una cadena de texto.
=REPT(texto; número)
Función SUBSTITUTE
P á g i n a 19 | 55
Por ejemplo, crear una columna que sobre la columna [ProductName] de la tabla
[DimProduct], reemplace “MP3” por “MP4”:
Función TRIM
Quita todos los espacios del texto salvo el espacio entre una palabra y otra.
=TRIM(texto)
Utilice TRIM en el texto que ha recibido de otra aplicación que puede tener un espaciado
irregular.
P á g i n a 20 | 55
Función VALUE
=VALUE(texto)
P á g i n a 21 | 55
FUNCIONES MATEMÁTICAS
Las funciones matemáticas de las Expresiones de análisis de datos (DAX) son muy
parecidas a las funciones matemáticas y trigonométricas de Excel.
CURRENCY
DIVIDE
INT / TRUNC
ROUND
SUM
P á g i n a 22 | 55
Función CURRENCY
Evalúa el argumento y devuelve el resultado como tipo de datos de moneda.
=CURRENCY(valor)
Función DIVIDE
Realiza la división y devuelve un resultado alternativo o BLANK() al dividirlo entre 0.
=DIVIDE(numerador; denominador; alternativa)
P á g i n a 23 | 55
Funciones INT y TRUNC
INT redondea un número al entero más cercano mientras que TRUNC trunca un número
en un entero al quitar la parte decimal, o fraccionaria, del número.
=INT(número)
=TRUNC(número)
TRUNC e INT son parecidos porque ambos devuelven enteros. TRUNC quita la parte
fraccionaria del número. INT redondea los números al entero más cercano basado en el
valor de la parte fraccionaria del número. INT y TRUNC solo son diferentes cuando se
utilizan números negativos: TRUNC(-4.3) devuelve -4, pero INT(-4.3) devuelve -5 porque -5
es el valor más bajo.
P á g i n a 24 | 55
Función ROUND
=ROUND(número; dígitos)
Función SUM
=SUM(columna)
Si desea filtrar los valores que está sumando, puede usar la función SUMX y especificar
una expresión para sumar.
P á g i n a 25 | 55
P á g i n a 26 | 55
FUNCIONES LÓGICAS
Las funciones lógicas actúan sobre una expresión para devolver información acerca de los
valores o conjuntos de la expresión.
Por ejemplo, puede utilizar la función IF para comprobar el resultado de una expresión y
crear resultados condicionales.
AND / OR
IF
IFERROR
SWITCH
P á g i n a 27 | 55
Funciones AND y OR
AND comprueba si ambos argumentos son TRUE y devuelve TRUE en ese caso. OR
comprueba si uno de los argumentos es TRUE para devolver TRUE. La función devuelve
FALSE si ambos argumentos son FALSE.
=AND(expresion1; expresion2)
=OR(expresion1; expresion2)
Ambas funciones sólo aceptan dos argumentos. Si necesitamos realizar operaciones con
varias expresiones, utilizaremos el operador AND (&&) o el operador OR (||) para unirlos
todos en una expresión más sencilla.
Por ejemplo, en la tabla [DimPromotion] creamos una columna calculada que devuelva
TRUE o FALSE cuando el año de la columna [StartDate] está comprendida entre los años
2003 y 2006:
Función IF
P á g i n a 28 | 55
Función IFERROR
=IFERROR(valor; valor_si_error)
P á g i n a 29 | 55
Función SWITCH
Evalúa una expresión con lista de valores y devuelve una de las varias expresiones de
resultado posibles.
Por ejemplo, crear una columna en la tabla [DimStore] que devuelva el nombre del día de
la semana de la columna [UpdateDate]:
P á g i n a 30 | 55
FUNCIONES DE FILTRO.
Las funciones del filtro y valor en DAX son las más complejas y eficaces, y difieren mucho
de las funciones de Excel. Las funciones de búsqueda usan tablas y relaciones, como una
base de datos. Las funciones de filtrado permiten manipular el contexto de los datos para
crear cálculos dinámicos.
P á g i n a 31 | 55
Introducción al contexto – contexto de fila y contexto de filtro
Contexto de la fila
P á g i n a 32 | 55
Contexto de filtro
Por ejemplo, la celda señalada tiene un contexto de filtro con dos filtros: País = Dinamarca
y Año = 2008. Es decir para calcular Sales se utilizan dos filtros. De ahí el viene el nombre
de contexto de filtro.
Las interrelaciones entre tablas son del tipo uno a muchos. En el lado muchos está la clave
foránea y en el lado del uno, la clave primaria. Cuando hay una interrelación y se aplica un
filtro a una tabla en el lado uno, también se filtrará la tabla del lado muchos.
FactSales
SalesKey FactInventory
DateKey DimDate InventoryKey
DateKey
DimChannel channelKey
StoreKey DimStore StoreKey
ProductKey ProductKey
PromotionKey CurrencyKey
DimPromotion
CurrencyKey DimGeography OnHandQuantity
UnitCost OnOrderQuantity
UnitPrice SafetyStockQuantity
ReturnQuantity DaysInStock
ReturnAmount MinDayInStock
DiscountQuantity MaxDayInStock
DimProductSubcategory
DiscountAmount Aging
TotalCost ETLLoadID
SalesAmount LoadDate
DimProductCategory P á g UpdateDate
i n a 33 | 55
ETLLoadID
LoadDate
UpdateDate
Así si filtramos [DimProducts] para un único producto, entonces [FactSales] también se
filtrará para que aparezcan sólo las transacciones de ese producto.
Sin embargo, aplicar un filtro a la tabla [FactSAles] no tendría ningún impacto sobre la
tabla [DimProducts].
Como ya sabemos, las consultas con totales son la base teórica de las tablas dinámicas y
estas, a su vez, utilizan funciones de agregado.
Estas funciones ya existen en Excel. Son, entre otras, SUM, AVG, MIN, MAX, COUNT.
A diferencia de Excel, en DAX se han añadido algunas nuevas funciones de agregación que
admiten como argumento la tabla y una expresión:
Así SUMX permite realizar la suma de un campo numérico aplicándole diferentes filtros
que vendrán dados por la expresión especificada en el segundo argumento.
Por ejemplo:
Esta fórmula dice que deberíamos empezar con la tabla FactSales, y para cada fila de la
tabla deberíamos evaluar la
expresión [UnitPrice] *
[SalesQuantity]. A continuación, los
resultados deben todos ser
sumados porque estamos usando la
función SUMX. Si hubiéramos usado
AVERAGEX, nos tomaría el
promedio de todos los resultados.
P á g i n a 34 | 55
La tabla FactSales está relacionada con DimChannel a través del campo ChannelKey
(Tienda)
P á g i n a 35 | 55
La función anterior cogerá cada una de las
tiendas (Channelkey) de la tabla DimChannel,
y en la tabla FactSales calculará la suma de
UnitPrice * SalesQuantity. Obtendremos el
subtotal para las ventas pertenecientes a un
determinado año y tienda ya que la tabla
dinámica tiene en filas la tienda y en columnas
el año.
P á g i n a 36 | 55
Que coincide con el total de la tabla dinámica:
P á g i n a 37 | 55
Funciones RELATED / RELATEDTABLE
DAX introduce las funciones RELATED y RELATEDTABLE para seguir las relaciones y
recuperar datos relacionados de otra tabla. Esto es más poderoso que BUSCARV en Excel
por dos motivos. En primer lugar, BUSCARV devuelve sólo la primera ocurrencia – no hay
ninguna promesa de integridad referencial y no hay garantía de que no había otra fila que
también habría igualado la búsqueda. En segundo lugar, no depende de la colocación de
las columnas en la tabla de búsqueda, ya que la función BUSCARV no permite devolver
hacia la izquierda.
=RELATED(columna)
En la tabla FactSales, vamos a añadir dos columnas calculadas usando estas fórmulas:
=RELATED(DimStore[StoreName])
=RELATED(DimGeography[ContinentName])
Estas fórmulas agregará dos columnas a la tabla FactSales, la primera que contiene el
nombre de cada tienda y el segundo que contiene el nombre del continente. El primero de
estos ejemplos sigue una sola relación FactSales a DimStore, mientras que la segunda
fórmula debe navegar dos relaciones: de FactSales a DimStore y luego de DimStore a
DimGeography. Estas fórmulas sólo requieren conocer el nombre de la columna que
desea devolver el valor.
P á g i n a 38 | 55
P á g i n a 39 | 55
=RELATEDTABLE(tabla)
Tenga en cuenta que esta función devuelve una tabla y no un valor escalar. Esto significa
que esta función no puede utilizarse por sí misma para definir una columna calculada. En
cambio esta función puede utilizarse para proporcionar un resultado intermedio que a su
vez es un argumento para otra función, como una función de agregación.
Por ejemplo:
=SUMX(RELATEDTABLE(FactSales); FactSales[SalesAmount])
Esta fórmula dice que queremos construir primero una tabla que contiene las filas de
FactSales que se relacionan con la fila actual. RELATEDTABLE(FactSales) asume que
tenemos una fila actual y que existe una relación entre la tabla y la tabla FactSales. Una
vez tenemos la tabla que contiene las filas relacionadas de las transacciones de ventas, se
coge la cantidad de ventas de cada fila [SalesAmount] y luego suma todas estas
cantidades.
Por ejemplo, si ponemos esta fórmula en las tablas [DimProduct] y [DimStore] podemos
conocer el total de las transacciones de ventas desglosadas por cada producto y por cada
tienda.
P á g i n a 40 | 55
NOTA IMPORTANTE.- Recordamos que en la versión 2010, los parámetros se separan
por comas, mientras que en la versión 2013 se separan por puntos y comas.
Función COUNTROWS
P á g i n a 41 | 55
=COUNTROWS(tabla)
Esta función se puede utilizar para contar el número de filas de una tabla base, pero se
suele usar con más frecuencia para contar el número de filas que es el resultado de filtrar
una tabla o de aplicar contexto a una tabla.
P á g i n a 42 | 55
Esta expresión nos devuelve el número de registros de la tabla [FactSales] pero no nos
devuelve el número de registros relacionados de cada producto.
Esta expresión nos devuelve el número de registros relacionados de cada fila a través del
campo relacionado [ProductKey].
Para comprobar la primera línea, el [ProductKey] es el código 1.
P á g i n a 43 | 55
Función FILTER
FILTER es una función DAX que devuelve una tabla de resultados, dependiendo de una
condición.
=FILTER(FactSales;RELATED(DimGeography[CityName])="Baltimore")
devolverá una tabla que contiene todas las filas de FactSales que tuvo lugar en la ciudad
de Baltimore. Para obtener las ventas totales de la ciudad de Baltimore, simplemente la
usaríamos como primer parámetro de la función SUMX:
=SUMX (FILTER(FactSales;RELATED(DimGeography[CityName])="Baltimore");[SalesAmount])
La tabla [DimChannel] está relacionada con la tabla [FactSales]. Si creamos una columna
calculada en la tabla [DimChannel] obtendremos el mismo valor para todos los registros
ya que está utilizando el contexto de fila, pero si creamos un campo calculado y una tabla
dinámica, observaremos la diferencia de resultados:
P á g i n a 44 | 55
Por motivo de los datos de las tablas implicadas y relacionadas, observamos que solo hay
ventas en el canal “Store”, pero tenemos las ventas segmentadas por años y el total
general coincide con la columna calculada de la tabla [DimChannel].
P á g i n a 45 | 55
Función DISTINCT
Devuelve una tabla de una columna que contiene los valores distintos de la columna
especificada. Se trata pues, de otro filtro que nos permite obtener una columna con
valores únicos.
=DISTINCT(columna)
Por ejemplo si queremos saber cuántas tiendas distintas intervienen en las transacciones,
haríamos:
=COUNTROWS(DISTINCT(FactSales[StoreKey]))
P á g i n a 46 | 55
P á g i n a 47 | 55
Contexto de Fila y Contexto de Filtro
Ahora que muchas de las funciones básicas de DAX se han descrito, echemos un vistazo a
algunos ejemplos de lo que entendemos por "Contexto de Fila" y "Contexto de Filtro"
porque representan conceptos que debemos entender para poder trabajar con algunas de
las funciones más avanzadas de DAX como CALCULATE, descrito más adelante.
Contexto de Fila
Contexto de Fila es considerado como la "fila actual". Esto es más evidente en los casos
donde una fórmula está siendo introducida en una columna calculada. Por ejemplo,
dentro de la tabla FactSales, podemos crear una fórmula para una columna calculada:
= [SalesQuantity] * [UnitCost]
Contexto de Filtro
El contexto de filtro es más complejo que el contexto de fila y puede describirse más
fácilmente como el conjunto de filtros asociados con una de las celdas en el área de los
valores de una tabla dinámica. Considere la siguiente tabla dinámica:
P á g i n a 48 | 55
Esta tabla dinámica tiene solamente un campo calculado Sales, con la fórmula
=SUM(FactSales[SalesAmount]). Esta fórmula única está siendo evaluado 72 veces
distintas (número de etiquetas de fila x número de etiquetas de columna), con 72
resultados diferentes, y cada uno de esos 72 resultados tiene un distinto Contexto de
filtro. La celda que está resaltada tiene el siguiente contexto de filtro:
[RegionCountryName] = "Spain"
[CalendarYear] = 2009
[ChannelName] = "Store"
[ContinentName] = "Europa"
Esto puede ser pensado como aplicar cuatro filtros a la tabla FactSales antes de evaluar la
fórmula que es simplemente la suma de los valores de [SalesAmount] para las filas que
quedan después de aplicar esos cuatro filtros. Esto es de donde viene el nombre
"Contexto de Filtro".
Función CALCULATE
La función CALCULATE es muy potente y muy útil, pero es un poco más difícil que
cualquiera de las funciones DAX descritas anteriormente.
P á g i n a 49 | 55
CALCULATE permite cualquier expresión de DAX a evaluarse en un contexto de filtro
especificado. Esto es equivalente a definir un campo calculado en una tabla dinámica.
CALCULATE hace lo siguiente:
Como primer ejemplo de utilización, escriba una fórmula en una columna calculada de
DimStore la fórmula:
=COUNTROWS(DimGeography)
P á g i n a 50 | 55
Sin embargo, si ahora escribimos en otra columna calculada:
=CALCULATE(COUNTROWS(DimGeography))
Otro ejemplo:
Las ventas del libro que estamos tratando se pueden realizar de cuatro canales distintos:
por catálogo, online, por distribuidos y por tienda (Store).
P á g i n a 51 | 55
Mediante el campo ChannelKey en la tabla FactSales se identifica el canal utilizado en la
transacción.
Supongamos que necesitamos realizar el análisis de ventas pero solo utilizando el canal de
tienda (Store).
La expresión:
hará que en la tabla dinámica “Ventas por país” solo se tengan en cuenta las ventas que se
han hecho por tienda.
P á g i n a 52 | 55
Observe el resultado ya que según los datos almacenados, las ventas en Dinamarca o
Alemania son diferentes en función del canal que analicemos. Luego observe la diferencia
que hay entre [Sales] y [Ventas por tienda].
P á g i n a 53 | 55
Función VALUES
La función VALUES devuelve todos los valores válidos para esta columna en el actual
contexto de filtro.
=VALUES(columna)
Aunque la tabla devuelta tenga un solo valor (o incluso ningún valor), seguirá siendo una
tabla.
Con esta función podremos conocer fácilmente el contexto de filtro actual. Esta función se
utilizará a menudo dentro de una función IF.
=VALUES(DimGeography[RegionCountryName]) = "Spain"
Por supuesto puede haber una tabla dinámica donde no se especifica el país, o una
situación donde varios países han sido seleccionados y sólo podemos comparar una tabla
a un solo valor cuando la tabla tiene un solo valor. Esto nos obliga a escribir algo como
esto para determinar lo que es el país actual:
= IF (COUNTROWS(VALUES(DimGeography[RegionCountryName])) = 1;
VALUES(DimGeography[RegionCountryName]);
"Ningún país seleccionado")
Esta fórmula dice que si hay sólo un país seleccionado en el contexto actual, devuelva el
nombre de ese país, y, en otro caso, devuelva la cadena "Ningún país seleccionado".
El resultado de la colocación de este campo calculado en una tabla dinámica donde el país
está en las etiquetas de fila se ve así:
P á g i n a 54 | 55
P á g i n a 55 | 55