Añadir una excepción a los resultados devueltos por una medida

Un caso con el que podemos encontrarnos es aquel en el que, tras crear una medida y llevarla a una visualización, deseamos que uno de los valores devueltos sea tratado de forma especial. Por ejemplo, podemos tener una tabla de datos con ventas en la que definimos la medida

Ventas = SUM(FactSales[SalesAmount])

...que totaliza las ventas en el contexto, y una segunda tabla con la lista de subcategorías (campo "ProductSubcategoryName") a las que pertenecen los productos vendidos. Si llevamos esta información a una tabla, el resultado es el siguiente:

Escenario de adición de una excepción a los valores devueltos por una medida

Supongamos ahora que deseamos que el valor correspondiente a una de estas subcategorías, "Monitors", por ejemplo, sea calculado de forma diferente, por ejemplo, simplemente sustituyendo el valor por un "Blank". Una primera aproximación a este problema sería comparar el valor contenido en el campo "ProductSubcategoryName" usando la función VALUES:

Ventas Corregidas = IF(
    VALUES(DimProductSubcategory[ProductSubcategoryName]) = "Monitors";
    [Ventas];
    BLANK()
)

Sin embargo, esta medida no va a funcionar siempre, pues la función VALUES devuelve una tabla con una fila conteniendo el conjunto de valores que la tabla o columna que incluye como argumento toma en el contexto actual, conjunto que no va a ser comparable directamente con una etiqueta como "Monitors" en aquellos casos en los que VALUES devuelva dos o más valores. Es decir, si en nuestra visualización se incluyen totales (o subtotales) en los que el campo que estamos analizando tome más de un valor, la medida [Ventas Corregidas] devolverá un error.

La forma de solucionar esto es asegurándose de que la comparación (VALUES(DimProductSubcategory[ProductSubcategoryName]) = "Monitors") se realiza solo cuando dicha columna contenga un único valor. Esto podemos conseguirlo usando la función HASONEVALUE de la siguiente forma:

Ventas Corregidas = IF(
    HASONEVALUE(DimProductSubcategory[ProductSubcategoryName]);
    IF(
        VALUES(DimProductSubcategory[ProductSubcategoryName]) <> "Monitors";
        [Ventas];
        BLANK()
    );
    [Ventas]
)

La condición principal ahora es si estamos considerando un único valor del campo. Si no es cierto, devolvermos la medida [Ventas]. Por el contrario, si es cierto, podemos realizar la comparación y tratar al valor "Monitor" (en nuestro caso) de forma excepcional. El resultado sería el siguiente:

Escenario de adición de una excepción a los valores devueltos por una medida

Funciones DAX involucradas
Enviado por admin el Lun, 03/12/2018 - 20:18