Forum Discussion

jerryr125's avatar
jerryr125
Helper IV
1 year ago
Solved

Rolling 12 Column Monthly Calculation

Hi

I am looking to do a Rolling 12 calculation in a table.

Example

 

Table_ABC:

 

DateQuantityRollingTwelve
1/1/20248 
2/1/202410 
3/1/202414 
4/1/202416 
5/1/202432 
6/1/202424 
7/1/202416 
8/1/202410 
9/1/202415 
10/1/202412 
11/1/202432 
12/1/20248197
1/1/202512201
2/1/202510201
3/1/202515202
4/1/202530216
5/1/202512196

 

Therefore, calculate the RollingTwelve column for each row as data is entered (dynamic).

 

Thanks - Jerry

  • You could add a calculated column:

     

    RollingTwelve = 
    CALCULATE(
        SUM(Table_ABC[Quantity]),
        FILTER(
            Table_ABC,
            Table_ABC[Date] <= EARLIER(Table_ABC[Date]) &&
            Table_ABC[Date] > EDATE(EARLIER(Table_ABC[Date]), -12)
        )
    )

     

    This will give you a rolling 12 month total for each row, results as follows

     

9 Replies

  • You could add a calculated column:

     

    RollingTwelve = 
    CALCULATE(
        SUM(Table_ABC[Quantity]),
        FILTER(
            Table_ABC,
            Table_ABC[Date] <= EARLIER(Table_ABC[Date]) &&
            Table_ABC[Date] > EDATE(EARLIER(Table_ABC[Date]), -12)
        )
    )

     

    This will give you a rolling 12 month total for each row, results as follows

     

    • jerryr125's avatar
      jerryr125
      Helper IV

      Hi wardy912 

       

      Thank you so much for the reply.  Actually might do the trick.

       

      How can I do a rolling 12 by StoreID ???

       

       

      Table_ABC

      Example:

       

       

      StoreIDDateQuantityRollingTwelve
      A1/1/20248 
      A2/1/202410 
      A3/1/202414 
      A4/1/202416 
      A5/1/202432 
      A6/1/202424 
      A7/1/202416 
      A8/1/202410 
      A9/1/202415 
      A10/1/202412 
      A11/1/202432 
      A12/1/20248197
      A1/1/202512201
      A2/1/202510201
      A3/1/202515202
      A4/1/202530216
      A5/1/202512196
      B1/1/202415 
      B2/1/202410 
      B3/1/202422 
      B4/1/202416 
      B5/1/202432 
      B6/1/202430 
      B7/1/202416 
      B8/1/202410 
      B9/1/202415 
      B10/1/202412 
      B11/1/202432 
      B12/1/20248218
      B1/1/202512215
      B2/1/202510215
      B3/1/202515208
      B4/1/202520212
      B5/1/202510190
      • wardy912's avatar
        wardy912
        Super User
        RollingTwelve = 
        CALCULATE(
            SUM('Table_ABC'[Quantity]),
            FILTER(
                'Table_ABC',
                'Table_ABC'[StoreID] = EARLIER('Table_ABC'[StoreID]) &&
                'Table_ABC'[Date] <= EARLIER('Table_ABC'[Date]) &&
                'Table_ABC'[Date] > EDATE(EARLIER('Table_ABC'[Date]), -12)
            )
        )

         

        Please give a thumbs up and confirm the solution if this helps, thanks

    • jerryr125's avatar
      jerryr125
      Helper IV

      Thank you again for your help wardy912 - appreciate it.

      One more question - is there a way to do create this calculation within the actual table in the dataflow (Power BI workspace) - Power Query ?  Thanks - Jerry

  • Hi jerryr125 

     

    Another possibility

     

    let
    Source = Your_Source,
    Join = Table.NestedJoin(Source, {"StoreID"}, Source, {"StoreID"}, "Source", JoinKind.LeftOuter),
    Expand = Table.ExpandTableColumn(Join, "Source", {"Date", "Quantity"}, {"Date.1", "Quantity.1"}),
    Filter = Table.SelectRows(Expand, each [Date.1]>=Date.AddMonths([Date], -11) and [Date.1]<=[Date]),
    Group = Table.Group(Filter, {"StoreID", "Date", "Quantity"},
    {{"Rolling Twelve", each if Table.RowCount(_)<12 then null else List.Sum([Quantity.1]), type number}})
    in
    Group

    Stéphane

  • mromain's avatar
    mromain
    Regular Visitor

    Hi,

     

    Here another solution:

    let
        Source = 
            let
                data = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("dZFBDsIwDAT/knMkbCcp5ch+o/T/3wBUSBzFe+hlVE2sneNIz5ST6Ov2/Uyspryf+YfNY5XOy8Rr53XiW+fN82Kdb57b8NyJZyf3PCbe/lxl4v1d1fgetXiG8XvzGjdPI/M0f46b58OLBPN0P5YqlwckC5YsNjxBFpAsWLKU4Q+ygGQByQKSBSQL4iwgWUCygGTBksUkmOfynG8=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [StoreID = _t, Date = _t, Quantity = _t])
            in
                Table.TransformColumns(data,{{"Date", each Date.FromText(_, "en-US"), type date}, {"Quantity", Int64.From, Int64.Type}}),
        AddColumnRollingTwelve = 
            let 
                bSource = Table.Buffer(Source[[StoreID], [Date], [Quantity]]) 
            in 
                Table.AddColumn(Source, "RollingTwelve", each 
                    let listRollingTwelve = Table.SelectRows(bSource, (r) => (r[StoreID] = [StoreID]) and (r[Date] > Date.AddMonths([Date], -12)) and (r[Date] <= [Date]))[Quantity] 
                    in 
                        if List.Count(listRollingTwelve) = 12 then List.Sum(listRollingTwelve) else null
                , Int64.Type)
    in
        AddColumnRollingTwelve
  • Hi jerryr125, here's another solution. Thanks

    Here's the code:
    let
    Source = #table(
    {"Date", "Quantity"},
    {
    {#date(2024, 1, 1), 8},
    {#date(2024, 2, 1), 10},
    {#date(2024, 3, 1), 14},
    {#date(2024, 4, 1), 16},
    {#date(2024, 5, 1), 32},
    {#date(2024, 6, 1), 24},
    {#date(2024, 7, 1), 16},
    {#date(2024, 8, 1), 10},
    {#date(2024, 9, 1), 15},
    {#date(2024, 10, 1), 12},
    {#date(2024, 11, 1), 32},
    {#date(2024, 12, 1), 8},
    {#date(2025, 1, 1), 12},
    {#date(2025, 2, 1), 10},
    {#date(2025, 3, 1), 15},
    {#date(2025, 4, 1), 30},
    {#date(2025, 5, 1), 12}
    }
    ),
    Custom1 = Table.TransformColumns(
    Table.AddIndexColumn(Source, "12-Month Rolling", 0, 1),
    {
    "12-Month Rolling",
    each List.Transform({_ - 11 .. _}, each try Source[Quantity]{_} otherwise null)
    }
    ),
    Custom2 = Table.TransformColumns(
    Custom1,
    {"12-Month Rolling", each if List.Count(List.RemoveNulls(_)) = 12 then List.Sum(_) else null}
    )
    in
    Custom2