Compartir vía


Uso de SELECTEDVALUE en lugar de VALUES

Como modelador de datos, es posible que en ocasiones tenga que escribir una expresión DAX que compruebe si una columna está filtrada por un valor específico.

En versiones anteriores de DAX, este requisito se satisfacía de forma segura con un patrón que implicaba tres funciones DAX: IF, HASONEVALUE y VALUES. La siguiente definición de medida presenta un ejemplo. Calcula el importe del impuesto de ventas, pero solo de las ventas efectuadas a los clientes de Australia.

Australian Sales Tax =
IF(
    HASONEVALUE(Customer[Country-Region]),
    IF(
        VALUES(Customer[Country-Region]) = "Australia",
        [Sales] * 0.10
    )
)

En el ejemplo, la función HASONEVALUE devuelve TRUE solo cuando un único valor de la columna Country-Region es visible en el contexto de filtro actual. Si es TRUE, la función VALUES se compara con el texto literal "Australia". Si la función VALUES devuelve TRUE, la medida Sales se multiplica por 0,10 (que representa el 10%). Si la función HASONEVALUE devuelve FALSE (ya que más de un valor filtra la columna), la primera función IF devolverá un valor en blanco.

El uso de HASONEVALUE es una técnica defensiva. Es necesario porque es posible que varios valores filtren la columna Country-Region. En este caso, la función VALUES devuelve una tabla de varias filas. La comparación de una tabla de varias filas con un valor escalar genera un error.

Recomendación

Se recomienda usar la función SELECTEDVALUE. Logra el mismo resultado que el patrón que se describe en este artículo, pero de forma más eficaz y elegante.

Con la función SELECTEDVALUE, ahora se reescribe la definición de la medida de ejemplo.

Australian Sales Tax =
IF(
    SELECTEDVALUE(Customer[Country-Region]) = "Australia",
    [Sales] * 0.10
)

Sugerencia

Es posible pasar un valor de resultado alternativo a la función SELECTEDVALUE. Se devuelve el valor de resultado alternativo cuando no se aplica ningún filtro (o se aplican varios) a la columna.