Desde que apareció el leguaje DAX se han ido creando multitud de expresiones de múltiples tipos y distintas complejidades, pero se ha apreciado que existen patrones que se utilizan muy a menudo. Uno de estos patrones es el de analizar a que nivel de granularidad nos encontramos para hacer un cálculo u otro, por ejemplo, imaginemos que tenemos que hacer el siguiente cálculo:

  • Medida que a nivel día calcule la suma de ventas, a nivel de mes calcule la media de las ventas y a nivel de año calcule el máximo de las ventas, dejando el resto de niveles temporales en blanco.

Para crear este ejemplo utilizaremos el libro de Adventure Works que venimos utilizando en los post sobre PowerPivot, este sería el resultado del calculo:

Novedades de PowerPivot en Denali (XII): HASONVALUE, nueva función DAX

Y este sería el cálculo que hemos aplicado:

=IF(COUNTROWS(VALUES(DimDate[FullDateAlternateKey]))=1,
	SUM(FactInternetSales[SalesAmount]),
	IF(COUNTROWS(VALUES(DimDate[EnglishMonthName]))=1,
		AVERAGE(FactInternetSales[SalesAmount]),
		IF(COUNTROWS(VALUES(DimDate[CalendarYear]))=1 && COUNTROWS(VALUES(DimDate[CalendarSemester]))>1 && COUNTROWS(VALUES(DimDate[CalendarQuarter]))>1,
			MAX(FactInternetSales[SalesAmount]),
			BLANK()
		)
	)
)

Básicamente lo que hacemos con esta expresión es ir comprobando el contexto para determinar que cálculo debemos realizar, estas validaciones de contexto las hacemos contando con countrows los registros filtrados de una columna concreta, registros que obtenemos con la función values. De manera que la combinación de countrows y values de una columna nos informará de cuantos miembros de esa columna hemos filtrado en ese contexto.

Con la nueva versión de PowerPivot y HASONVALUE podemos acortar esta expresión haciendo la siguiente sustitución:

COUNTROWS(VALUES(<X>))=1	 <---------------->         HASONVALUE(<X>)

Quedando la expresión de la siguiente manera:

=IF(HASONEVALUE(DimDate[FullDateAlternateKey]),
	SUM(FactInternetSales[SalesAmount]),
	IF(HASONEVALUE(DimDate[EnglishMonthName]),
		AVERAGE(FactInternetSales[SalesAmount]),
		IF(HASONEVALUE(DimDate[CalendarYear]) && NOT(HASONEVALUE(DimDate[CalendarSemester])) && NOT(HASONEVALUE(DimDate[CalendarQuarter])),
			MAX(FactInternetSales[SalesAmount]),
			BLANK()
		)
	)
)

Aquí podemos ver la comparación de los dos cálculos:

Novedades de PowerPivot en Denali (XII): HASONVALUE, nueva función DAX

Cómo podemos ver, la expresión se hace mucho más comprensible y ocupa menos espacio, por lo que seremos más eficientes y claros al escribir nuestro código DAX. Podéis encontrar otro ejemplo de esta función y otras muy interesantes en el webcast sobre DAX del 24 de Noviembre.

Espero que os guste y nos vemos en futuros posts.

Ilde

 

0 Shares:
Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

You May Also Like

Introducción al Text Mining con R: Parte I

En la entrada de hoy vamos a echarle un ojo a algunas herramientas para realizar análisis de texto utilizando R. Tal y como describe el titulo, este post es introductorio, por lo que se basa en la técnica ‘Bag of words’, es decir, no existe análisis semántico del texto, sino que se trabaja con palabras. 

Cuando haces BOT ya no hay stop

Hoy en día no es raro encontrarse con un Bot como medio para interactuar con una plataforma online. La creciente implantación de esta tecnología en el mercado, nos invita a conocer Azure Bot Framework. Repasaremos las herramientas disponibles, el proceso de creación, buenas practicas, casos de uso y muchos más. Acompáñanos ¡cuando hacer bot ya no hay stop!
Leer más

Backups y restores “al vuelo” sin almacenamiento intermedio

Seguramente los más “senior” recordarán la posibilidad que existía en versiones SQL Server antiguas de realizar backups utilizando named pipes. Cuando hablo de versiones antiguas, me refiero a “antiguas de verdad”, ya que esta funcionalidad fue marcada como obsoleta en SQL Server 7, se mantuvo en SQL 2000 pero ya se eliminó de SQL Server 2005 y posteriores.