Jueves y toca el último post sobre los itearadores y el último hasta septiembre ya que tengo la mala costumbre de cogerme vacaciones J.

A lo largo de esta entrada hablaré sobre los iteradores, en concreto de la función RANKX. La función RANKX, según la web de Microsoft, devuelve la clasificación de un número en una lista de números de cada fila del argumento table. Y su sintaxis es la siguiente:

 

 

Dónde:

Table: Cualquier expresión DAX que devuelve una tabla de datos en la que se evalúa la expresión.

Expression: Cualquier expresión DAX que devuelve un valor escalar único. La expresión se evalúa para cada fila de table, para generar todos los valores posibles para la clasificación. Vea la sección Notas para comprender el comportamiento de la función cuando expression se evalúa como BLANK.

Value: (Opcional) Cualquier expresión DAX que devuelva un único valor escalar cuya clasificación se quiere obtener. Vea la sección Notas para conocer el comportamiento de la función cuando no se encuentra value en la expresión.

Cuando se omite el valor de value, se usa en su lugar el valor de la expresión de la fila actual.

Order: (Opcional) Valor que especifica cómo clasificar value, de inferior a superior o de superior a inferior:

 

 

Ties: Enumeración que define cómo determinar la clasificación cuando hay asociaciones.

 

 

Como podemos ver, la función RANKX se le pueden hasta 5 argumentos, pero sólo 2 de ellos son obligatorios, el resto opcionales.

Bueno, hasta aquí como siempre la parte más tediosa desde mi punto de vista, que es la parte teórica. Vamos con la práctica que es con la más se aprende y para ello vamos como siempre a nuestro modelo de Contoso de Power BI.

Arrastramos a nuestro informe una tabla y como fila arrastramos el nombre de los almacenes:

 

 

Cogemos nuestra medida favorita, que es la suma de las ventas:


 

Y la arrastramos a la matriz que tenemos en el informe de manera que obtengamos las ventas totales por almacen:

 

 

Una vez obtenida la matriz de las ventas por almacen, queremos obtener un ranking que nos devuelva la posición de cada uno de ellos respecto al volumen de las ventas. ¿Y cómo lo podemos hacer? Con la función RANKX, que es la estrella del post de hoy. Para ello escribimos lo siguiente:

 

 

Como sólo son obligatorios los dos primeros argumentos, de momento no rellenamos ningún otro y arrastramos la medida a la matriz:

 

 

Y vemos que nos devuelve el valor que ocupa cada país en el ranking, pero os estaréis preguntando, Javi, ¿no te has dado cuenta de que está devolviendo todo el rato el valor 1?

Y sí, sí me he dado cuenta, y que me devuelva un 1 en todas no está mal, y ahora os lanzo yo una pregunta, ¿por qué es que me está devolviendo todo el rato un 1?

La respuesta es simple, y es por el contexto de fila. Si no lo veis claro os recomiendo que antes de seguir os leáis el post sobre el contexto de fila que hice, aquí os dejo el link.

¿Y cómo solucionamos o mejor dicho como hacemos para que me muestre el ranking en función del total de las ventas? Pues modificando el contexto y para ello usaremos la función ALL para indicarle que coja todos los países de los almacenes de la siguiente manera:

 

 

Y arrastramos la medida a la matriz:

 

 
 Y como podemos ver, ahora sí nos está realizando el ranking como queremos.


cómo podéis ver, la función RANKX nos ha generado un registro con valor 1 en el contexto de fila de Total y analíticamente no tiene sentido, por lo que una buena práctica es ocultar ese valor para evitar ese sin sentido. ¿Y cómo lo hacemos? Pues por ejemplo con la función HASONEVALUE.

 

Nota: HASONEVALUE Devuelve TRUE si el contexto de columnName se ha filtrado a un solo valor distinto. De lo contrario, es FALSE. Cuya sintaxis es:


 

Una vez avanzado la función y sintaxis de la función, escribimos lo siguiente:

 

 

Lo que estamos haciendo con la función condicional IF y HASONEVALUE es decir que si la columna de StoreName tiene un valor, entonces nos devuelve TRUE y ejecuta el RANKX, sino tiene valor devuelve BLANK() (también podríamos haberlo dejado en blanco la opción FALSE.

 

¿Se os ocurre otra forma de ocultar el valor Total mediante DAX?... Seguro que sí, es con una de mis funcione favoritas… ¡Exacto! Con ISINSCOPE, si no tenéis claro cómo usarla, os dejo aquí el post en el que hablaba de ISINSCOPE.

 

 

Y como resultado, hemos llegado al mismo puerto, pero por distinto camino ya que ISINSCOPE trabaja con jerarquías.

 

 
Como he comentado anteriormente, RANKX acepta 5 argumentos, no solo los dos primeros. Hay tres argumentos restantes, que son los siguientes:
 
El tercer parámetro es la expresión del valor, que puede ser útil cuando se utilizan diferentes expresiones para evaluar, respectivamente, la tabla de búsqueda y el valor a utilizar para la clasificación. ¿Y para qué nos puede servir este parámetro? Por ejemplo, cuando queramos hacer rankings mediante agrupaciones:  

  1. Si tenemos nuestros clientes y queremos hacer un ranking para saber los grupos de edad que más nos compran.
  2. Si queremos hacer un ranking de ventas agrupado por valores escalados.

Para poder llevar a cabo la agrupación, debemos de tener definida la tabla por la que queremos agrupar, para este ejemplo, he creado la siguiente tabla de agrupaciones:


 

Y la métrica para agruparla por la misma es la siguiente:

 

 

Y nos devuelve lo siguiente en la matriz:

 

 

Y si vemos las 3 primeras líneas nos devuelve un 3, que corresponden a la agrupación 3 de la tabla. ¿Y por qué el valor más alto es 1? Lo vemos en el siguiente punto, pero antes, ¿cómo ejecuta la sintaxis DAX para que me devuelva la agrupación?

 

 

Se crea obteniendo el valor de AgrupaciónImportes en el contexto de la fila de AgrupacionVentas. Una vez que se crea la tabla de búsqueda, RANKX evalúa Total Ventas en el contexto de evaluación original

El cuarto parámetro es el orden de clasificación de la tabla de búsqueda. Puede ser ASC o DESC.  El valor predeterminado es DESC, con los valores más altos en la parte superior, es decir, un valor más alto da como resultado una clasificación más baja, de ahí que el valor 1 sea el del valor más alto en la tabla anterior. Si queremos modificarlo, basta con indicarlo en la medida:

 

 

Y nos devuelve:

 

 

Como podemos ver, el valor de las filas ha variado y las 3 primeras han pasado de estar en la posición 3 del ranking a estar en la posición 16.

Y el quinto último parámetro define cómo calcular los valores en caso de empate. Puede ser DENSE o SKIP (Omitir). Si es DENSE, los vínculos se eliminan de la tabla de búsqueda; de lo contrario, se mantienen o lo que es lo mismo:

 
Y se acabo el iterador RANKX y hasta aquí la entrada de hoy y la última de agosto... Nos vemos a la vuelta en Septiembre con muchas novedades.
 
¡Nos vemos en los datos!