Resolución del ejercicio

Ya vimos en un ejercicio anterior cómo podíamos obtener el IVA total iterando la tabla Sales, obteniendo el IVA parcial y sumando los resultados:

Total IVA = 
SUMX(
    Sales,
    [Amount] * (1 - Sales[Discount]) * 0.21
)

La diferencia con este nuevo escenario es que ahora el IVA no va a ser constante para todas las ventas, sino que dependerá de la categoría a la que pertenezca el producto vendido en cada caso. El objetivo es iterar la tabla de ventas (igual que hicimos en su momento) pero devolver un resultado parcial u otro (considerando en uno un IVA del 21% y en el otro del 11%) en función de la categoría del producto de que se trate.

Si rescribimos nuestra medida usando pseudo-código, sería algo como:

Total IVA = 
SUMX(
    Iteramos la tabla de ventas,
    Obtenemos la categoría de la venta siendo iterada
    Si la categoría es igual a "Services" entonces devolvemos
        [Amount] * (1 - Sales[Discount]) * 0.11
    En otro caso devolvemos
        [Amount] * (1 - Sales[Discount]) * 0.11
)

La obtención de la categoría de la venta siendo iterada puede realizarse usando la función RELATED pues la relación entre la tabla de ventas y la de categorías es de tipo “uno” (del lado de la categoría) a “varios” (del lado de las ventas). En realidad, no hay una relación directa entre estas dos tablas, pero todas las relaciones intermedias entre ambas tablas son de este tipo:

Modelo de datos

Es decir, podríamos rescribir la medida de la siguiente forma:

Total IVA = 
SUMX(
    Sales,
    VAR __category = RELATED(Category[Category])
    RETURN
        Si la categoría es igual a "Services" entonces devolvemos
            [Amount] * (1 - Sales[Discount]) * 0.11
        En otro caso devolvemos
            [Amount] * (1 - Sales[Discount]) * 0.11
)

Obsérvese que nuestra variable __category lleva asociada un RETURN (como ocurre con todas las variables) de forma que lo que se devuelva en dicho RETURN será el valor parcial que se irá sumando con la función SUMX.

Una vez identificada la categoría es muy sencillo completar el código usando la función IF:

Total IVA = 
SUMX(
    Sales,
    VAR __category = RELATED(Category[Category])
    RETURN
        IF(
            __category = "Services",
            [Amount] * (1 - Sales[Discount]) * 0.11,
            [Amount] * (1 - Sales[Discount]) * 0.21
        )
)

Si llevamos la medida a una tarjeta vemos el resultado:

Total IVA