jueves, 20 de mayo de 2021

Power Pivot-DAX: HASONEVALUE

Hoy hablaremos de una de esas funciones DAX de las que todo el mundo habla, y siempre es dificil de entender: HASONEVALUE('Nombre_columna')
A priori es una función muy simple. Solo identifica con VERDADERO cuando en el contexto de filtro actual se obtiene un único (y distinto) valor. Devolverá FALSO en otro caso.
Es decir, a priori es una función Boolena (retorna VERDADERO o FALSO) donde se evalúa, en la situación de filtros aplicados en ese instante, si existe o no un único valor distinto...
Equivaldría a cualquiera de estas dos expresiones DAX:
DISTINCTCOUNT(Columna) = 1
COUNTROWS ( VALUES ( Columna ) ) = 1

Tratemos de entender su comportamiento.
Tenemos una tabla de datos cargada al Modelo de datos en Power Pivot para Excel.
A partir de la cual hemos creado una Tabla dinámica desde nuestro editor de Power Pivot.
Power Pivot-DAX: HASONEVALUE


En nuestro Modelo de datos hemos creado las siguientes medidas
CR1:=COUNTROWS(Tabla1)
DC1:=DISTINCTCOUNT(Tabla1[Cliente])
CR_V2:=COUNTROWS ( VALUES ( Tabla1[Cliente]) )
HasOneValue1:=HASONEVALUE(Tabla1[Cliente])
IF_HOV:=IF(HASONEVALUE(Tabla1[Cliente]);"un solo cliente";DISTINCTCOUNT(Tabla1[Cliente]))
HOV1:=CALCULATE(HASONEVALUE(Tabla1[Cliente]);Tabla1[Artículo] IN {"x2";"x4"})

En el área de cálculo de nuestra tabla cargada:
Power Pivot-DAX: HASONEVALUE

Y configuraremos nuestra tabla dinámica llevando, de momento el campo de 'Artículos' al área de filas, y nuestras seís medidas al área de valores...
Power Pivot-DAX: HASONEVALUE

Nos fijaremos en primer lugar en las tres medidas:
CR1:=COUNTROWS(Tabla1)
DC1:=DISTINCTCOUNT(Tabla1[Cliente])
CR_V2:=COUNTROWS ( VALUES ( Tabla1[Cliente]) )

Donde COUNTROWS realiza un conteo del total de registros incluidos en ese 'contexto de filtro actual', en nuestro caso para esos artículos en concreto nada más.
Donde DISTINCTCOUNT cuenta el número de clientes disitintos para ese artículo mostrado...
Lo que coincide con COUNTROWS ( VALUES(...)). Donde VALUES con una columna como argumento, devuelve una tabla de una columna que contiene los valores distintos de la columna especificada... esto es, los valores duplicados se quitan y solo se devuelven los valores únicos.

Interesante estas dos últimas medidas, ya que se ajustan al contexto de filtro en cada momento de nuestra tabla dinámica, para identificar resgistros distíntos o únicos...
Precisamente lo que nos interesa conocer, especialmente cuando ese conteo sea uno.

Nos fijaremos a continuación en las demás medidas:
HasOneValue1:=HASONEVALUE(Tabla1[Cliente])
IF_HOV:=IF(HASONEVALUE(Tabla1[Cliente]);"un solo cliente";DISTINCTCOUNT(Tabla1[Cliente]))
HOV1:=CALCULATE(HASONEVALUE(Tabla1[Cliente]);Tabla1[Artículo] IN {"x2";"x4"})

Lo que vemos en la tabla dinámica, en el área de valores:
Power Pivot-DAX: HASONEVALUE

La primera medida:
HasOneValue1:=HASONEVALUE(Tabla1[Cliente])
nos devuelve VERDADERO en aquellos artículos (contexto de filtro actual) donde solo existe un único Cliente, esto es, artículos: x2, x4 y x8
Fácil de ver si incluimos en el área de filas el campo 'Cliente', subordinado al 'Artículo':
Power Pivot-DAX: HASONEVALUE

Comprobamos que solo para esos tres artículos comentados (x2, x4 y x8) se cumple la 'condición' de tener un solo cliente...
OJO!!, al incluir el campo 'Cliente' en la tabla dinámica el contexto de filtro ha cambiado, y por tanto el resultado devuelto por esas medidas también... ya que bajo este supuesto de doble filtro (Artículo + Cliente), todas las combinaciones son únicas, y por tanto HASONEVALUE retorna siempre VERDADERO!!

De forma similar la segunda medida:
IF_HOV:=IF(HASONEVALUE(Tabla1[Cliente]);"un solo cliente";DISTINCTCOUNT(Tabla1[Cliente]))
donde en realidad evaluamos la misma cuestión (un solo cliente)... pero donde el valor lógico devuelto lo empleamos dentro de un condicional IF, y convertir en VERDADERO en un texto y el FALSO en un cálculo de distintos.

En la tercera medida nos aprovechamos de CALCULATE para limitar la 'búsqueda' solo a los elementos x2 y x4 (los indicados en el argumento de filtro de CALCULATE.
Podemos comprobar en la imagen siguiente, como solo para esos dos artículos obtenemos el VERDADERO:
Power Pivot-DAX: HASONEVALUE

Solo los clientes DOS y TRES contienen un único valor para los artículos x2 o x4:
Power Pivot-DAX: HASONEVALUE

El cliente UNO al no contener ningún artículo x2 o x4 devuelve FALSO...

Un último ejemplo consistiría en aplicar un nuevo filtro sobre otro campo, por ejemplo sobre los trimestres.
Comprobamos como cambia el resultado si el filtro es el Trim.1 o el Trim.2, ya que los 'clientes únicos' son unos u otros en cada caso.
Para el 'Trim.1' solo los artículos x1, x6, x8 y x9 continen un único cliente:
Power Pivot-DAX: HASONEVALUE


Mientras que en el 'Trim.2' son los artículos x2, x4, x5 y x6 los que despliegan un solo cliente...
Power Pivot-DAX: HASONEVALUE


El uso más general de esta función, en base a lo que he visto en el día a día, es controlar el cálculo del Total general... si bien, creo que su potencial (en mi opinión) pasa por discriminar el cálculo mostrado en esos casos de concurrencia única...
Cosa que veremos en ejemplos posteriores.

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.