La función HASONEVALUE devuelve el valor lógico True cuando el contexto ha reducido el número de valores distintos de la columna indicada como argumento a uno, y el valor lógico False en cualquier otro caso.
HASONEVALUE(
columnName
)
- columnName: Nombre de una columna. No puede ser una expresión.
La función HASONEVALUE devuelve un booleano.
La función analiza cómo el contexto afecta a la columna indicada como argumento. Si aquel ha reducido el número de valores o elementos distintos de la columna a un único valor, la función devuelve True. Si la columna mantiene un número distinto de valores únicos (cero o más de uno), devuelve False. Esta función es, por lo tanto, equivalente a:
COUNTROWS(VALUES(columnName)) = 1
Dada una tabla de ventas, definimos la siguiente medida que calcula el total de ventas:
Ventas = SUM(FactSales[SalesAmount])
Si llevamos a una matriz la lista de categorías (su código, en este ejemplo) y subcategorías junto con las ventas asociadas, el resultado es el siguiente:
Supongamos ahora que deseamos indicar el porcentaje que las ventas de cada subcategoría suponen respecto del total. Definimos para ellos la medida:
Ventas totales = CALCULATE(
[Ventas],
ALL(DimProductSubcategory[ProductCategoryKey]),
ALL(DimProductSubcategory[ProductSubcategoryName])
)
(medida que, tal y como está definida, va a ser independiente del contexto al respecto de categorías y subcategorías).
Para mostrar el porcentaje que suponen las ventas respecto del total definimos ahora la medida correspondiente:
% ventas = DIVIDE([Ventas], [Ventas totales])
Si añadimos esta medida a la matriz anterior obtenemos:
Pero se ha comentado que solo nos interesa el porcentaje para las subcategorías, no para los totales de categorías ni para el gran total. Para el cálculo de la columna de ventas o del porcentaje el contexto reduce la columna "ProductSubcategoryName" a 1) un único elemento (en aquellos casos en los que el cálculo está contabilizando las ventas de una subcategoría concreta), 2) a todas las subcategorías de una categoría (en los totales de categoría) o 3) a todas las subcategorías existentes (en el cálculo del gran total). Es esta información la que analiza la función HASONEVALUE. Vamos, por lo tanto, a modificar la medida que calcula el porcentaje de las ventas de la siguiente forma:
% ventas = IF(
HASONEVALUE(DimProductSubcategory[ProductSubcategoryName]),
DIVIDE([Ventas], [Ventas totales]),
BLANK()
)
La condición evaluada en la función IF es, precisamente, si la columna DimProductSubcategory[ProductSubcategoryName] queda reducida -debido al contexto- a un único valor o no. Tal y como se ha comentado, cuando se reduzca a un único valor será debido a que el cálculo se corresponde con las ventas de una única subcategoría. Y cuando no se reduzca a un único valor será porque se está calculando un total (de categoría o el gran total). Con esta nueva definición de la medida [% ventas], la matriz tiene el siguiente aspecto:
...que muestra el porcentaje solo para las subcategorías, tal y como queríamos.