Power BI DAX: DATEADD versus PREVIOUSMONTH

Home Power BI DAX Power BI DAX: DATEADD versus PREVIOUSMONTH

Omdat ik van mijn klanten vragen krijg over dit onderwerp heb ik besloten er een blog aan te wijden. Wat is het verschil tussen DATEADD en PREVIOUSMONTH? Is het resultaat niet hetzelfde? Het antwoord is dat dit soms zo is, maar zeker niet altijd.

In dit scenario is het resultaat op maandniveau hetzelfde

Hier is het:

DATEADD =
CALCULATE (
[Sales],
DATEADD ( dim_Calender[Date] , -1 , MONTH )
)

PREVIOUSMONTH =
CALCULATE (
[Sales],
PREVIOUSMONTH ( dim_Calender[Date] )
)

Dit geeft eenvoudigweg de Verkoop van de maand vóór die in de initiële filtercontext. Het enige verschil hier is het resultaat op jaar- en totaalniveau. DATEADD geeft de som van de resultaten op maandniveau, terwijl PREVIOUSMONTH de eerste maand van het jaar op jaarniveau geeft en geen resultaat op totaalniveau. Om op jaar- en totaalniveau een resultaat te verkrijgen dat overeenkomt met het door DATEADD verkregen resultaat is een iterator nodig die alle jaren en alle maanden afloopt en vervolgens de resultaten optelt, hetgeen kan worden gedaan met SUMX.

Hier is het:

PREVIOUSMONTH =
SUMX (
VALUES ( dim_Calender[YearMonth] ),
CALCULATE (
[Sales],
PREVIOUSMONTH ( dim_Calender[Date] )
)
)

Maar het echte verschil is te zien wanneer we naar het individuele dagniveau kijken.

PREVIOUSMONTH, vergelijkbaar met PARALLELPERIOD, geeft het resultaat voor de hele vorige maand, ook al is de individuele dag ingevoerd in de filtercontext. Geen van beide is "fout" of "goed", het hangt allemaal af van de informatiebehoefte van de gebruiker van het dashboard.

Laten we nu eens kijken hoe we de verkoop van 2 maanden geleden kunnen verkrijgen. Dit is de aangepaste code voor de twee formules.

Hier is het:

DATEADD =
CALCULATE (
[Sales],
DATEADD ( dim_Calender[Date] , -2 , MONTH )
)

PREVIOUSMONTH =
CALCULATE (
[Sales],
PREVIOUSMONTH ( PREVIOUSMONTH ( dim_Calender[Date] ) )
)

Hier is het:

Hetzelfde gedrag kan worden waargenomen. Deze keer echter moet PREVIOUSMONTH worden vervangen door PARALLELPERIOD. Dat is gemakkelijker te schrijven en te lezen en heeft een snellere prestatie. Hier is de code van de laatste.

PARALLELPERIOD =
CALCULATE
[Sales],
PARALLELPERIOD ( dim_Calender[Date], -2, MONTH )
)

Tussen haakjes, hier is de code voor de tabel Verkoop die ik voor dit voorbeeld heb gebruikt.

Sales =
ADDCOLUMNS (
CALENDER (
DATE ( 2017, 01, 01, ),
DATE ( 2020, 07, 10, )
),
"Value",
DATEDIFF ( DATE ( 2020, 07, 10 ), [Date], DAY )
)