Cuando estamos creando medidas en PowerPivot es muy habitual jugar con los contextos para realizar cálculos complejos. Cómo ya veíamos en la serie sobre la evaluación de contextos tenemos multitud de funciones que nos permite modificar el contexto para adecuar el cálculo a nuestras necesidades. Una de las modificaciones más habituales que hacemos es la de eliminar los filtros establecidos por slicers, filters, filas y columnas, para lo cual utilizábamos funciones como ALL o ALLEXCEPT. Hasta el momento con ALL lo que hacíamos era eliminar todos los filtros establecidos y con ALLEXCEPT eliminábamos todos los filtros establecidos salvo los que pasábamos como parámetros a la función, ahora con SQL Server 2012 aparece una nueva función: ALLSELECTED, que nos permitirá seleccionar todo aquello filtrado explícitamente por el usuario (slicers y filtros). Esto es muy útil cuando queremos calcular por ejemplo porcentajes de contribución al padre.

Como siempre la forma más sencilla de entender el funcionamiento es con un ejemplo práctico asique vamos allá. Disponemos de un modelo semántico BISM que incorpora algunas tablas de Adventure Works, entre ellas la tabla de ventas por Internet. Lo primero que hacemos es añadir una columna calculada con la ganancia de cada venta en esta tabla:

image_thumb_0B8BFBD9

Ahora nuestro objetivo es definir una medida en el modelo semántico que permita analizar al usuario analizar el porcentaje de ganancia que proporciona una determinada celda de la tabla dinámica respecto a los datos filtrados explícitamente mediante slicers, por ejemplo analizando por año, trimestre y mes y filtrando en slicers los datos de la geografía.

image_thumb_1_0B8BFBD9

Nos gustaría saber rápidamente para cada uno de esos meses que porcentaje de ganancia hemos obtenido sobre el total obtenido en esa geografía. Hasta el momento lo que haríamos sería crear una función en DAX que eliminara todos los contextos establecidos excepto las columnas utilizadas en los slicers mediante ALLEXCEPT, pero claro ¿y si mañana el usuario añade un nuevo slicer? ¿cómo sabemos que columnas está utilizando si este análisis lo hace después de haber creado el modelo?… La respuesta a estas preguntas es ALLSELECTED, que nos permite hacer un calculo basándonos en todo lo filtrado por el usuario. Esta sería la formula de la medida que debemos añadir en nuestro modelo:

=Sum(FactInternetSales[Profit])/CALCULATE(SUM(FactInternetSales[Profit]),ALLSELECTED())

Y este sería el resultado en nuestro análisis de Excel:

image_thumb_2_0B8BFBD9

Hay que destacar la versatilidad que ofrece esta función a nuestro cálculo, ya que si ahora añadimos por ejemplo un slicer para el color del producto no necesitamos modificar nada.

image_thumb_3_0B8BFBD9

Hasta aquí nuestro ejemplo de ALLSELECTED Sonrisa. En TechNet disponéis de algún ejemplo más y de información sobre esta función. Espero que os haya gustado y os sea de utilidad.

 

Un saludo

Ilde

 

Ildefonso Mas

Ildefonso is a former SolidQ team member.

Latest posts by Ildefonso Mas (see all)