Forum Discussion

hamzashafiq's avatar
hamzashafiq
Kudo Collector
4 years ago
Solved

Create Index Column on Power Query based on 2 or 3 Columns

Hi Folks,

 

I have below dataset, I want to create an index column based on Bill+Ship+Serial and date/invoice_number columns. Each Serial Number has multiple invoices on different dates, so I want to create the index column based on those invoices. The problem I'm facing when two invoices are on same date, my formula put 1,1 for both of those which I don't want. Can anyone help me to do this using Power Query. I don't want to do this using DAX as it affect the performance of report. Thanks

 

Invoice #Invoice DateBill Customer IDShip Customer IDSerial NumberBill+Ship+SerialIndex
I11-JanB1S1a1B1S1a11
I22-JanB1S1a1B1S1a12
I33-JanB1S1a1B1S1a13
I44-JanB1S1a1B1S1a14
I55-JanB1S1a1B1S1a15
I61-JanB2S2a2B2S2a21
I71-JanB2S2a2B2S2a22
I83-JanB2S2a2B2S2a23
I94-JanB2S2a2B2S2a24
I105-JanB2S2a2B2S2a25
  • IN Power Query, first sort your data to make sure it's in a format similar to what you've shown.

    Then do a 'Group BY' using the key columns (

    Bill Customer ID Ship Customer ID Serial Number Bill+Ship+Serial

    ) - you might get away with the first 3 if it's enough to show correct groups -

    with one aggregation on All rows called 'all'.

    Then add a custom column with this:

    Table.AddIndexColumn([all], "CountInd",1,1)

    This adds an index per Grouping.

    You can then expand column headings to return the appropriate data.

    A fair bit to get your head around but that should work.

  • Step 1
    In Power Query, do...

    Group by : Bill+Ship+Serial

    New Column Name : Table_1

    Operation : All Raws

     

    Step 2

    Add Custom Column...

    Table_2 = Table.AddIndexColumn([Table_1],"Index",1)

     

    Step 3

    Expand Table_2

     

    That's it.

  • mahenkj2's avatar
    mahenkj2
    4 years ago

    Infact, don't need that if data is sorted by Invoice number.

     

    Paste this in advanced editor:

    let
        Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
        #"Changed Type" = Table.TransformColumnTypes(Source,{{"Invoice #", type text}, {"Invoice Date", type datetime}, {"Bill Customer ID", type text}, {"Ship Customer ID", type text}, {"Serial Number", type text}, {"Bill+Ship+Serial", type text}, {"Index", Int64.Type}}),
        #"Grouped Rows" = Table.Group(#"Changed Type", {"Bill+Ship+Serial"}, {{"Count", each _, type table}}),
        #"Added Custom" = Table.AddColumn(#"Grouped Rows", "IndexUse", each Table.AddIndexColumn([Count],"IndexNow",1)),
        #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Count"}),
        #"Expanded IndexUse" = Table.ExpandTableColumn(#"Removed Columns", "IndexUse", {"Invoice #", "Invoice Date", "Bill Customer ID", "Ship Customer ID", "Serial Number", "Bill+Ship+Serial", "Index", "IndexNow"}, {"Invoice #", "Invoice Date", "Bill Customer ID", "Ship Customer ID", "Serial Number", "Bill+Ship+Serial.1", "Index", "IndexNow"})
    in
        #"Expanded IndexUse"

     

    Table1 is your sourcedata table name.

     

    Hope it helps.

10 Replies

  • ddpl's avatar
    ddpl
    Solution Sage

    Step 1
    In Power Query, do...

    Group by : Bill+Ship+Serial

    New Column Name : Table_1

    Operation : All Raws

     

    Step 2

    Add Custom Column...

    Table_2 = Table.AddIndexColumn([Table_1],"Index",1)

     

    Step 3

    Expand Table_2

     

    That's it.

  • mahenkj2's avatar
    mahenkj2
    Solution Sage

    Hi hamzashafiq ,

    Instead of invoice date, can you use Invoice number in your indexing forumlae. So as 'Bill+Ship+Serial' changes index shall set to 1 and since Invoice number keep incrementing, index has to increment as well.

     

    Assuming you may have no time part in the Invoice date information.

      • mahenkj2's avatar
        mahenkj2
        Solution Sage

        Infact, don't need that if data is sorted by Invoice number.

         

        Paste this in advanced editor:

        let
            Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
            #"Changed Type" = Table.TransformColumnTypes(Source,{{"Invoice #", type text}, {"Invoice Date", type datetime}, {"Bill Customer ID", type text}, {"Ship Customer ID", type text}, {"Serial Number", type text}, {"Bill+Ship+Serial", type text}, {"Index", Int64.Type}}),
            #"Grouped Rows" = Table.Group(#"Changed Type", {"Bill+Ship+Serial"}, {{"Count", each _, type table}}),
            #"Added Custom" = Table.AddColumn(#"Grouped Rows", "IndexUse", each Table.AddIndexColumn([Count],"IndexNow",1)),
            #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Count"}),
            #"Expanded IndexUse" = Table.ExpandTableColumn(#"Removed Columns", "IndexUse", {"Invoice #", "Invoice Date", "Bill Customer ID", "Ship Customer ID", "Serial Number", "Bill+Ship+Serial", "Index", "IndexNow"}, {"Invoice #", "Invoice Date", "Bill Customer ID", "Ship Customer ID", "Serial Number", "Bill+Ship+Serial.1", "Index", "IndexNow"})
        in
            #"Expanded IndexUse"

         

        Table1 is your sourcedata table name.

         

        Hope it helps.

  • HotChilli's avatar
    HotChilli
    Community Champion

    IN Power Query, first sort your data to make sure it's in a format similar to what you've shown.

    Then do a 'Group BY' using the key columns (

    Bill Customer ID Ship Customer ID Serial Number Bill+Ship+Serial

    ) - you might get away with the first 3 if it's enough to show correct groups -

    with one aggregation on All rows called 'all'.

    Then add a custom column with this:

    Table.AddIndexColumn([all], "CountInd",1,1)

    This adds an index per Grouping.

    You can then expand column headings to return the appropriate data.

    A fair bit to get your head around but that should work.