Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

The Power BI Data Visualization World Championships is back! It's time to submit your entry. Live now!

Reply
Syndicate_Admin
Administrator
Administrator

Necesito ayuda con Dax: Cálculo de ventas del año anterior

Hola a todos
Solo intento averiguar las ventas de años anteriores basándome en la percepción del valor de Kpi por parte del usuario.
Estoy recibiendo el resultado como las ventas del año en curso.
¿Alguien puede explicarme el contexto del filtro y el funcionamiento de este código?
Si es que hay alguna versión optmizada del código. Por favor, házmelo saber.

Ventas del año anterior =
VAR Current_year =
SELECTEDVALUE ( 'Tabla del Calendario'[Año], 0 )
VAR Sales_Current_year =
SWITCH (
SELECTEDVALUE ( 'tabla Kpi'[valor KPI]),
"pérdida", SUM ('Ventas anuales'[Pérdida]),
"Beneficio", SUM ('Ventas anuales'[Beneficios]),
"Ventas", SUM ('Ventas anuales'[Ventas])
)
VAR Previous_year_Sales =
CALCULATE (
Sales_Current_year,
TODOS ('Tabla del Calendario'[Año]),
'Tabla del Calendario'[Año] = Current_year - 1
)
DEVOLUCIÓN
Previous_year_Sales

1)

maverickf17_0-1768049878599.png
2)

maverickf17_1-1768049924718.png
Gracias

6 REPLIES 6
Syndicate_Admin
Administrator
Administrator

Hola @maverickf17 ,
Gracias por ponerte en contacto con la comunidad Microsoft Fabric.

Solo quería comprobar si tu consulta se ha resuelto y si alguna respuesta ha sido útil.
Si no, no dudes en pedir ayuda adicional.

Gracias.

Syndicate_Admin
Administrator
Administrator

@maverickf17

Las variables DAX son inmutables. Puedes aplicarle operaciones aritméticas, pero no puedes modificar su contexto con CALCULATE.

Previous Year Sales :=
VAR CurrentYear =
    SELECTEDVALUE (
        'Calendar Table'[Year],
        0
    )
RETURN
CALCULATE (
    SWITCH (
        SELECTEDVALUE ( 'Kpi table'[KPI value] ),
        "loss",   SUM ( 'Yearly sales'[Loss] ),
        "Profit", SUM ( 'Yearly sales'[Profit] ),
        "Sales",  SUM ( 'Yearly sales'[Sales] )
    ),
    ALL ( 'Calendar Table'[Year] ),
    'Calendar Table'[Year] = CurrentYear - 1
)
Syndicate_Admin
Administrator
Administrator

Esa variable se evalúa una vez en el contexto actual del filtro (así que para la fila Year=2022, pasa a ser "Ventas en 2022"). Después de eso, dentro de CALCULATE() no estás reevaluando la lógica SWITCH "nueva" del año anterior—estás pasando un resultado escalar ya evaluado a CALCULATE.

Si tu calendario tiene una columna real de [Fecha] y está marcada como tabla de fechas, y tu tabla de datos está relacionada con ella por Fecha, entonces puedes hacer:

1) Crear una medida base:

KPI Amount =
SWITCH(
    SELECTEDVALUE('Kpi table'[KPI value]),
    "loss",   SUM('Yearly sales'[Loss]),
    "Profit", SUM('Yearly sales'[Profit]),
    "Sales",  SUM('Yearly sales'[Sales]),
    BLANK()
)

2) Entonces el año anterior se vuelve trivial:

KPI Amount PY =
CALCULATE( [KPI Amount], DATEADD('Calendar Table'[Date], -1, YEAR) )

Syndicate_Admin
Administrator
Administrator

¡Hola @maverickf17

Para solucionar esto, la lógica SWITCH debe evaluarse dentro de la función CALCULATE para que pueda responder al filtro de año nuevo.

La solución DAX optimizada

Utiliza esta versión para asegurarte de que el cálculo respete el cambio interanual:

Previous year Sales = 
VAR _CurrentYear = SELECTEDVALUE( 'Calendar Table'[Year] )
VAR _SelectedKPI = SELECTEDVALUE( 'Kpi table'[KPI value] )

RETURN
CALCULATE (
    SWITCH (
        _SelectedKPI,
        "loss",   SUM( 'Yearly sales'[Loss] ),
        "Profit", SUM( 'Yearly sales'[Profit] ),
        "Sales",  SUM( 'Yearly sales'[Sales] )
    ),
    REMOVEFILTERS( 'Calendar Table'[Year] ),
    'Calendar Table'[Year] = _CurrentYear - 1
)

Comprendiendo el contexto del filtro

  1. La trampa variable: En tu código original, Sales_Current_year calculado la suma para el año que está actualmente en la serie (por ejemplo, 2024). Aunque tu CALCULATE intentó mirar 2023, solo estaba mirando el número ya calculado de 2024.
  2. Evaluación interna: Al mover el SWITCH dentro de CALCULATE, le dices a Power BI: "Primero, cambia el año a 2023 y luego ejecuta la lógica SUM".
  3. REMOVER FILTROS VS TODOS: Usar REMOVEFILTERS es la forma moderna y optimizada de borrar un filtro específico sin borrar todo el contexto de la tabla.

Validación visual

  • Selección de derrotas: Cuando se selecciona "pérdida", la medida mostrará correctamente 1000 en la fila de 2022 (reflejando el valor de 2021).
  • Selección de beneficios: Cuando se seleccione "Beneficio", 2022 mostrará 1500 (reflejando el valor de 2021).

Resumen para la comunidad

Las variables en DAX son constantes. Si necesitas que un cálculo cambie en función de un nuevo filtro (como un año anterior), debes realizar la lógica de cálculo directamente dentro de la sentencia CALCULATE o llamar a una medida directamente, en lugar de referenciar una variable precalculada.

Si esta explicación de la transición de contexto resuelve tu error de cálculo, ¡márcalo como la "Solución aceptada"!

Hola @AshokKunwar ,
Por favor, encuentra el siguiente fragmento.

maverickf17_0-1768054151991.png
El DAX que proporcionaste no funciona correctamente:

Previous year Sales = 
VAR _CurrentYear = SELECTEDVALUE( 'Calendar Table'[Year] )
VAR _SelectedKPI = SELECTEDVALUE( 'Kpi table'[KPI value] )

RETURN
CALCULATE (
    SWITCH (
        _SelectedKPI,
        "loss",   SUM( 'Yearly sales'[Loss] ),
        "Profit", SUM( 'Yearly sales'[Profit] ),
        "Sales",  SUM( 'Yearly sales'[Sales] )
    ),
    REMOVEFILTERS( 'Calendar Table'[Year] ),
    'Calendar Table'[Year] = _CurrentYear - 1
)



¡Hola @maverickf17

Cuando usas _CurrentYear = SELECTEDVALUE(...) como variable, se fija al año de la fila actual. Si tu Tabla de Calendario tiene relación con tu tabla de ventas anuales, debemos tener mucho cuidado con cómo anulamos ese filtro.

La solución: Arreglar el contexto de evaluación

La forma más completa de manejar esto es calcular primero las ventas totales de todos los tiempos y luego aplicar el filtro del año específico. Sustituye tu medida por esta versión:

Previous year Sales = 
VAR _CurrentYear = SELECTEDVALUE( 'Calendar Table'[Year] )
VAR _SelectedKPI = SELECTEDVALUE( 'Kpi table'[KPI value] )

RETURN
IF ( 
    ISBLANK(_CurrentYear), 
    BLANK(),
    CALCULATE (
        -- Step 1: Perform the Switch logic
        SWITCH (
            _SelectedKPI,
            "loss",   SUM( 'Yearly sales'[Loss] ),
            "Profit", SUM( 'Yearly sales'[Profit] ),
            "Sales",  SUM( 'Yearly sales'[Sales] )
        ),
        -- Step 2: Clear the current year filter and force it to Year - 1
        ALL( 'Calendar Table' ),
        'Calendar Table'[Year] = _CurrentYear - 1
    )
)

Por qué funciona esta versión donde la otra falló:

  1. ALL ('Calendar Table') vs REMOVEFILTERS: Aunque suele preferirse REMOVEFILTERS, en algunas configuraciones de modelos donde hay varias columnas de fecha (como Fecha, Mes, Año), borrar solo el filtro "Año" no es suficiente. ALL limpia toda la tabla, asegurando que la 'Tabla del Calendario'[Año] = _CurrentYear - 1 sea el único filtro que actúe sobre la fecha.
  2. La Guardia ISBLANK: Esto evita que la medida intente calcular "Año 0" o "Año -1" al final de la tabla o en filas totales, lo que a menudo provoca que el cálculo devolva resultados confusos.
  3. Alcance variable: Seguimos capturando el _CurrentYear al principio, pero al usar ALL inside CALCULATE, saltamos efectivamente fuera del "cubo" de la fila actual y entramos en el del año anterior.

Paso de verificación

Revisa tu relación con la Tabla de Calendario . Si la relación está en una columna de Fecha en lugar de una columna de Año (que es estándar), asegúrate de que tu Tabla de Calendario esté marcada como Tabla de Fechas en Power BI. Si no lo es, la lógica de la inteligencia temporal a veces puede comportarse de forma inconsistente.

Si esta lógica actualizada finalmente traslada tus datos de ventas al año correcto, ¡márcalo como la "Solución Aceptada"!

Helpful resources

Announcements
FabCon Atlanta 2026 carousel

FabCon Atlanta 2026

Join us at FabCon Atlanta, March 16-20, for the ultimate Fabric, Power BI, AI and SQL community-led event. Save $200 with code FABCOMM.