Forum Discussion

jimmyfromus's avatar
jimmyfromus
Icon for Helper III rankHelper III
5 years ago
Solved

Merge multiple rows into one row

Hi, 

 

I'm a bit stuck on this one (which should be easy 🙂 )

I've the following table: 

Company (parentcustomerid)Companycontactidmandate_idCustomPresidentChairmanDistrict manager
5546aa33-6008-eb11-a813-000d3aaa0022Company A1183acbb-6808-eb11-a813-000d3aaa002228d65051-a826-eb11-a813-000d3aaa0022Jim100
763020c6-4c47-e611-b8e2-005056877b93Company B25faa22d-3a77-e111-8ec2-001e0bc5057228d65051-a826-eb11-a813-000d3aaa0022Brian100
763e1e19-0e50-e711-aa28-005056877b93Company C5a911844-f681-e911-b20d-005056877b93cabfca3d-a826-eb11-a813-000d3aaa0022Mike001
cd470dc6-5319-de11-8062-001e0bc50572Company D304c52a2-968a-e811-8833-005056877b9328d65051-a826-eb11-a813-000d3aaa0022John M100
cd470dc6-5319-de11-8062-001e0bc50572Company D304c52a2-968a-e811-8833-005056877b93cabfca3d-a826-eb11-a813-000d3aaa0022John M001
cd470dc6-5319-de11-8062-001e0bc50572Company D304c52a2-968a-e811-8833-005056877b93edb6892b-a826-eb11-a813-000d3aaa0022John M010

 

 

And I need the following: 

Company (parentcustomerid)Companycontactidmandate_idCustomPresidentChairmanDistrict manager
5546aa33-6008-eb11-a813-000d3aaa0022Company A1183acbb-6808-eb11-a813-000d3aaa002228d65051-a826-eb11-a813-000d3aaa0022Jim100
763020c6-4c47-e611-b8e2-005056877b93Company B25faa22d-3a77-e111-8ec2-001e0bc5057228d65051-a826-eb11-a813-000d3aaa0022Brian100
763e1e19-0e50-e711-aa28-005056877b93Company C5a911844-f681-e911-b20d-005056877b93cabfca3d-a826-eb11-a813-000d3aaa0022Mike001
cd470dc6-5319-de11-8062-001e0bc50572Company D304c52a2-968a-e811-8833-005056877b9328d65051-a826-eb11-a813-000d3aaa0022John M111

 

Basically just one for John M, not separated for President, Chairman and District manager values. 

 

Thank you for any help.  

 

 

 

 

 

 

 

 

 

 

  • jimmyfromus ,

     

    Here's how to do my suggestion above, if that will work.

     

    In Power Query, go to New Source>Blank Query then in Advanced Editor paste my code over the default code. You can then follow the steps I took to complete this.

     

    let
        Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("vZG9TkMxDEZfpbpzLTl/ju9Iy4TUJ6g6OIkrKtRbxMbb44CoUEuhHWCwZCk5zvGX9XpIKZJICECIDFqcA2EXABFbEBFE74f5sDzsn2V6nd1Z7xwHqaUA8U+I50YJUz/0dPnaw27fZ1rhe23m6yFTQI+VINaYQcnQwuoNtYHEOZcxfJFa9NfSVsT7BkGyIc4Q1toRp1iqcfkGqcXLTqbvtNSpGwE1IWjusHi+pLW0PsloccUIW2IHOvZNPLZTpErZVgntF63V7kmPRt2uW9UWMzYLKwVTa9o3Rzrb/NPq3vqAsSYvHkZiAeWOcAinVtf+4OFxmq3O0vo7ryvTOnr9V17aCvHoyy1eH5ltNm8=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [CompanyID = _t, Company = _t, contactid = _t, mandate_id = _t, Custom = _t, President = _t, Chairman = _t, #"District manager" = _t]),
        chgAllTypes = Table.TransformColumnTypes(Source,{{"CompanyID", type text}, {"Company", type text}, {"contactid", type text}, {"mandate_id", type text}, {"Custom", type text}, {"President", Int64.Type}, {"Chairman", Int64.Type}, {"District manager", Int64.Type}}),
        groupPerson = Table.Group(chgAllTypes, {"Custom"}, {{"data", each _, type table [CompanyID=nullable text, Company=nullable text, contactid=nullable text, mandate_id=nullable text, Custom=nullable text, President=nullable number, Chairman=nullable number, District manager=nullable number]}}),
        addCalcPresident = Table.AddColumn(groupPerson, "calcPresident", each Table.Max([data], "President")),
        expandCalcPresident = Table.ExpandRecordColumn(addCalcPresident, "calcPresident", {"President"}, {"President"}),
        addCalcChairman = Table.AddColumn(expandCalcPresident, "calcChairman", each Table.Max([data], "Chairman")),
        expandCalcChairman = Table.ExpandRecordColumn(addCalcChairman, "calcChairman", {"Chairman"}, {"Chairman"}),
        addCalcDistrictManager = Table.AddColumn(expandCalcChairman, "calcDistrictManager", each Table.Max([data], "District manager")),
        expandCalcDistrictManager = Table.ExpandRecordColumn(addCalcDistrictManager, "calcDistrictManager", {"District manager"}, {"District manager"}),
        expandDataGroup = Table.ExpandTableColumn(expandCalcDistrictManager, "data", {"CompanyID", "Company", "contactid", "mandate_id"}, {"CompanyID", "Company", "contactid", "mandate_id"})
    in
        expandDataGroup

     

    This gives me the following output:

     

     

    Pete

  • jimmyfromus 

    If you want to keep the field for mandate_id, which one is to be shown for John since there are 3 distinct values attributed to him?

    This is as far as I've got.

    First the model. (I've created a Dim job table to keep the job order in the visual)

     

    1) Unpivot the last 3 columns (President, Chairman and District Manager columns) in Power Query to get this:

     2) create a measure for the Sum of Value and then another to group by the name:

    Grouped by Name =
    CALCULATE (
        [Sum Value],
        ALLEXCEPT (
            'DataTable',
            'DataTable'[Company (parentcustomerid)],
            'DataTable'[Company],
            'DataTable'[contactid],
            'DataTable'[Job]
        )
    )

     

    Create a matrix visual with the "Dim job [job]" column as the columns and add the [Grouped by name] and you get this:

     

    We are getting 3 rows for John because there are 3 distinct mandate-Ids attributed to him.

     

10 Replies

  • Hi jimmyfromus ,

     

    In Power Query, multi-select (hold down ctrl+click) all the fields from [Company (parentcustomerid)] to [Custom].

    Then go to the Home tab on the ribbon and select 'Group By'. The fields you selected previously should be showing in the top half of the dialogue box.

    In the bottom half, add an aggregation for each of your [President], [Chairman], and [District Manager] fields.

    - New column name = what you want the new column to be called

    - Operation = make this MAX

    - Column = the column you want to perform the operation on

    You will need to do this three times - once for each of your position fields.

    Hit OK and this should group rows as required.

     

    Pete

      • BA_Pete's avatar
        BA_Pete
        Icon for Super User rankSuper User

        Hi jimmyfromus ,

         

        Sorry, I didn't notice that your [mandate_id] field was unique to each row. I presumed it was duplicated on each row as your desired output example showed it grouped.

        How do you want the [mandate_id] field handled? If it can be removed, then the grouping will work fine as I believe your other ID fields duplicate on each row. Otherwise, we will need some logic to tell Power BI which of the unique [mandate_id] values to keep when grouping.

         

        Pete

  • PaulDBrown's avatar
    PaulDBrown
    Icon for Community Champion rankCommunity Champion

    jimmyfromus 

    If you want to keep the field for mandate_id, which one is to be shown for John since there are 3 distinct values attributed to him?

    This is as far as I've got.

    First the model. (I've created a Dim job table to keep the job order in the visual)

     

    1) Unpivot the last 3 columns (President, Chairman and District Manager columns) in Power Query to get this:

     2) create a measure for the Sum of Value and then another to group by the name:

    Grouped by Name =
    CALCULATE (
        [Sum Value],
        ALLEXCEPT (
            'DataTable',
            'DataTable'[Company (parentcustomerid)],
            'DataTable'[Company],
            'DataTable'[contactid],
            'DataTable'[Job]
        )
    )

     

    Create a matrix visual with the "Dim job [job]" column as the columns and add the [Grouped by name] and you get this:

     

    We are getting 3 rows for John because there are 3 distinct mandate-Ids attributed to him.