Forum Discussion

beginner's avatar
beginner
Icon for Helper I rankHelper I
3 years ago
Solved

How to calculate dates using start and end date distribute per month

I would like to calculate dates per location and sum the date count per calendar month. When there is no end date I want to keep counting and distrubute it per month.    IncidentID|Lost work start|...
  • ronrsnfld's avatar
    ronrsnfld
    3 years ago

    OK, here is a method using Power Query M Code (which I just happened to develop earlier for a similar problem).

    Home =>Trnasform data=>Advanced Editor  and paste the code into the window that opens (deleting whatever might be there)

    let
        Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSUTLUN9I3MjAyAjONYUy/1HKFyPyibKVYHZgyU5hcXmlODroSkDjQHLhRQIY5jB2Sn52ZD1dljKTKBImNqgooA7fPXB9dUSwA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [IncidentID = _t, #"Lost work start" = _t, #"lost work end" = _t, Location = _t]),
        #"Changed Type" = Table.TransformColumnTypes(Source,{{"IncidentID", Int64.Type}, {"Lost work start", type date}, {"lost work end", type date}, {"Location", type text}}),
    
    //Create all months list
        #"Last Day" = Date.From(DateTime.FixedLocalNow()),
        #"all Dates" = 
            List.Dates(
                List.Min(#"Changed Type"[Lost work start]),
                Duration.Days(#"Last Day"-List.Min(#"Changed Type"[Lost work start])) + 1,
                #duration(1,0,0,0)),
        #"all MnthYr" = List.Distinct(List.Transform(#"all Dates", each Date.ToText(_,"yyyy-MM"))),
    
    //List of Dates for each row
        #"Days per Month" = Table.AddColumn(#"Changed Type", "Dates List", each 
            let 
                LWD = 
                    List.Dates(
                        [Lost work start],
                        Duration.Days(List.Min({[lost work end], #"Last Day"}) - [Lost work start]) + 1,
                        #duration(1,0,0,0)),
                MnthYr = List.Transform(LWD, each Date.ToText(_,"yyyy-MM")),
        
            //Group by MnthYr and count
                Group = Table.Group(Table.FromColumns({MnthYr} & {LWD}),{"Column1"},{
                    {"Days in Month", each Table.RowCount(_), Int64.Type}}),
                Pivot = Table.Pivot(Group,List.Sort(Group[Column1]),"Column1","Days in Month")
            in 
                Pivot),
        #"Expanded Dates List" = Table.ExpandTableColumn(#"Days per Month", "Dates List", #"all MnthYr"),
    
        #"Sort Month/Year Columns" = 
            let 
                colsToSort = List.RemoveFirstN(Table.ColumnNames(#"Expanded Dates List"),4),
                #"Sorted Order" = List.Sort(colsToSort),
                #"Reorder Columns" = Table.ReorderColumns(#"Expanded Dates List",#"Sorted Order")
            in 
                #"Reorder Columns",
    
        #"Month To Name" = Table.RenameColumns(#"Sort Month/Year Columns",
            List.Transform(List.RemoveFirstN(Table.ColumnNames(#"Sort Month/Year Columns"),4), each{_, Date.ToText(Date.From(_),"MMM-yy")})),
        #"Grouped Rows1" = Table.Group(#"Month To Name", {"Location"}, {
    
           //Sum each month
            {"Sum Each Month", (t)=> Record.FromList(
                
                    List.Accumulate(List.RemoveFirstN(Table.ColumnNames(t),4),{}, (a,b)=>
                        a & {List.Sum(Table.Column(t,b))}), List.RemoveFirstN(Table.ColumnNames(t),4))
            }}),
        #"Expanded Sum Each Month" = Table.ExpandRecordColumn(#"Grouped Rows1", "Sum Each Month", 
            List.RemoveFirstN(Table.ColumnNames(#"Month To Name"),4)),
            
        #"Typed" = Table.TransformColumnTypes(#"Expanded Sum Each Month", 
                        List.Transform(List.RemoveFirstN(Table.ColumnNames(#"Expanded Sum Each Month")), each {_, Int64.Type}))
    in
        #"Typed"

    Results: