Forum Discussion

jayjay0306's avatar
jayjay0306
Helper III
6 years ago
Solved

Rolling average last 3 months

Hi,
I hope you can help me with a shallange:
I have a Power BI report, where I need to make a measure (I don't have access to the source table) which calculates the rolling average for the last 3 months.
And the rolling average shall be made on the sum per month (not rolling on the date value).
Example:
in the table below, I have the "Daily Sales-Sum per month" in 2019. The datasource is one table (not a datamodel with dimensions and facts), where leaf-level is transactions by date.
I need the rolling average on the monthly sum-values.

I have tried to make the measure (please see below), but the result is wrong(table above).

 

DAX-Script:

--------------------------------------
Rolling Average 3 months =
VAR LastDate_ = LASTDATE(Table[Calendar Day])
RETURN
AVERAGEX(
DATESINPERIOD(
'Table'[Calendar Day];
LastDate_; -3; MONTH);
SUMX(
KEEPFILTERS(VALUES('Table'[Month]));
CALCULATE(SUM('Table'[Sales]))
)
)
---------------------------------------------

 

the result I need is this (here shown for the last two months, as an example):

 

Any ideas? All inputs will be greatly appreciated.

Thanks.

Br,

JayJay

  • Anonymous's avatar
    Anonymous
    6 years ago

    How about this?

     

    Rolling Average 3 months =
    VAR LastDate_ =
        LASTDATE ( Table[Calendar Day] )
    RETURN
        CALCULATE (
            AVERAGEX ( VALUES ( 'Table'[Month] ); CALCULATE ( SUM ( 'Table'[Sales] ) ) );
            FILTER (
                ALL ( Table );
                [Calendar Day] <= LastDate_
                    && [Calendar Day] > DATEADD ( LastDate_; -3; MONTH )
            )
        )

     

    Similar to yours, but i changed the table for AVERAGEX to iterate over to the month values. Also changed the calcualte filter a little bit.

15 Replies

  • Anonymous's avatar
    Anonymous
    Not applicable

    How about this?

     

    Rolling Average 3 months =
    VAR LastDate_ =
        LASTDATE ( Table[Calendar Day] )
    RETURN
        CALCULATE (
            AVERAGEX ( VALUES ( 'Table'[Month] ); CALCULATE ( SUM ( 'Table'[Sales] ) ) );
            FILTER (
                ALL ( Table );
                [Calendar Day] <= LastDate_
                    && [Calendar Day] > DATEADD ( LastDate_; -3; MONTH )
            )
        )

     

    Similar to yours, but i changed the table for AVERAGEX to iterate over to the month values. Also changed the calcualte filter a little bit.

    • jayjay0306's avatar
      jayjay0306
      Helper III

      Hi Ulf,

      Brilliant! it works. 🙂

      Thanks a lot.

      The only remark I have is, that the rolling average doesn't react to the filters I have in the PBI report.

      The value "Table[Sales]" is part of you calculation, but if I fx.filter on "Sales area" the "Sales" per month respond accordingly, but the rolling average remains the same. I find this a bit strange.

      Can you tell me why?any ideas?

      Thanks anyway.

      Br,

      Jakob

      • Anonymous's avatar
        Anonymous
        Not applicable

        Yes, it's because of ALL(Table) in the filter. All filters are removed to be able to access previous months. It should be possible to modify the CALCULATE / FILTER expression to only remove the filters on date/year/month. To do that easier and better I suggest creating a connected date table instead of having the date columns in the "fact" table. Dimensional models are usually easier to work with in Power BI! Then you can do the same thing as now but on the date table  - ALL([NewDateTable]) instead of ALL(Table).

    • jytech's avatar
      jytech
      Helper I

      Anonymous what if I have a separate Date Table separate from my Facts Table?

      • Anonymous's avatar
        Anonymous
        Not applicable

        jytech, it should be the same as long as you have set up a relationship between the tables. This is the preferred way to set up the model. Then filter the date table instead of the fact table in the measure.

    • jayjay0306's avatar
      jayjay0306
      Helper III

      Hi Greg,

      thanks for your input. much appreciated. The solution didn't quite solve my problem, but I got wiser on DAX. 🙂

       

  • Hi, I have similar issue, I tried to modify you DAX but I have received circular error, could you help to solve it? I have changed first line after FILTER because I need to calculate rolling 3months average per Plant. My column Date, contains "real" date dd/mm/yyyy, (first day of each month)

    3MonthsRollingAverage =

    VAR LastDate_ =

    LASTDATE ( COGSTotal[Date])

    RETURN

    CALCULATE (

    AVERAGEX ( VALUES (COGSTotal[Date]), CALCULATE ( SUM ( COGSTotal[Total COGS] ) ) ),

    FILTER (

    COGSTotal,

    COGSTotal[Plant]=EARLIER(COGSTotal[Plant]) &

    [Date] <= LastDate_

    && [Date] > DATEADD ( LastDate_, -3, MONTH )) )

  • I am not having any luck with this formula.  It keeps erroring out on me and I can't figure out where I am going wrong.  Trying to do 3-month rolling (hopefully dynamic) average.  For month 2021-02, 3 month average should be 15.3%  Can provide more data if needed.  Any help or direction would be welcomed.  Thanks!

     

    • EVIJ's avatar
      EVIJ
      Regular Visitor

      I am struggling with the same issue. Do you have a solution yet?

      • JLincoln's avatar
        JLincoln
        Advocate I

        The Semicolons in the formula should be commas if you're working on it in America. Different syntax.

  • yash09's avatar
    yash09
    Frequent Visitor

    i m using dax for rolling avg 3 month and that gets is result 

     

    Total sales 3MA = AVERAGEX(
             WINDOW(
                -[NR MONTHS  Value],REL,0,REL,
                SUMMARIZE(
                    ALLSELECTED(dimDate),
                    dimDate[Year],
                    dimDate[Month],
                    dimDate[Month Number]
                ),
                 ORDERBY(dimDate[Year],ASC,dimDate[Month],ASC)
             ),[TOTAL SALES]
    )