Forum Discussion

COIL-ibesmond's avatar
2 years ago

How to merge null rows with a single value to non-null rows and create new columns for those values

Any ideas for how to solve this situation in Power Query?

 

I have a data set with 70+ columns.  One column has data consuming multiple rows, however the number of rows is not consistent because the data is coming from a concatenated datasource that needs to be broken out into additional columns.

 

Here is some sample data.

 

Date StartedID RecordLocationClient IDProduct IDDate EndedIssue(s)
12/1/20235062CA2201695054312/5/2023MB122751
      Shipped to wrong address
       ; MB166876
      New product needed
4/27/20235651CT238669572824/28/2023MB170216
      Product not needed
5/29/20235776UT271549766316/5/2023MB129825
      Wrong item shipped
       ; MB119711
      New product needed
6/16/20235143LA268569882026/17/2023MB152495
      Product defective
5/11/20235462WA296129496245/12/2023MB111923
      Product never shipped
4/7/20235573TN289109005594/8/2023MB147625
      Product defective
       ; MB119718
      Ship new product
6/19/20235032FL250409425706/26/2023MB155569
      Incorrect Address
       ; MB198598
      Shipped two products
10/9/20235582WA2347891580710/13/2023MB158250
      Product refused on delivery
2/16/20235519UT215799734592/21/2023MB184858
      Shipped to wrong address
       ; MB100392
      Missing product
10/4/20235253CA2389297944410/11/2023MB108939
      Product defective
       ; MB135906
      Ship new product
8/29/20235974NC280019223129/3/2023MB134361
      Product not needed
11/9/20235768MI2422793287011/15/2023MB158967
      Shipped to wrong address
       ; MB181152
      Wrong product shipped
4/2/20235437VT210849881774/5/2023MB166099
      Duplicate product shipped
12/26/20225970NE2304698410512/31/2022MB128569
      Missing product
       ; MB171239
      Product shipped separately

 

This is the desired result.

 

Date StartedID RecordLocationClient IDProduct IDDate EndedIssue(s)ReasonIssue IDReason 2
12/1/20235062CA2201695054312/5/2023MB122751Shipped to wrong addressMB166876New product needed
4/27/20235651CT238669572824/28/2023MB170216Product not needed  
5/29/20235776UT271549766316/5/2023MB129825Wrong item shippedMB119711New product needed
6/16/20235143LA268569882026/17/2023MB152495Product defective  
5/11/20235462WA296129496245/12/2023MB111923Product never shipped  
4/7/20235573TN289109005594/8/2023MB147625Product defectiveMB119718Ship new product
6/19/20235032FL250409425706/26/2023MB155569Incorrect AddressMB198598Shipped two products
10/9/20235582WA2347891580710/13/2023MB158250Product refused on delivery 
2/16/20235519UT215799734592/21/2023MB184858Shipped to wrong addressMB100392Missing product
10/4/20235253CA2389297944410/11/2023MB108939Product defectiveMB135906Ship new product
8/29/20235974NC280019223129/3/2023MB134361Product not needed  
11/9/20235768MI2422793287011/15/2023MB158967Shipped to wrong addressMB181152Wrong product shipped
4/2/20235437VT210849881774/5/2023MB166099Duplicate product shipped  
12/26/20225970NE2304698410512/31/2022MB128569Missing productMB171239Product shipped separately

 

Thank you,

 

ibesmond

4 Replies

  • let
        Source = your_table,
        f = (tbl) => 
            [lst = List.Skip(tbl[#"Issue(s)"]),
            res = tbl{0} & [Reason = lst{0}?, Issue ID = Text.Remove(lst{1}?, {" ", ";"}), Reason 2 = lst{2}?]
            ][res],        
        gr = Table.Group(
            Source, "ID Record", {{"row", f}},
            GroupKind.Local, (s, c) => Byte.From(Value.Is(c, Number.Type))
        ),
        z = Table.FromRecords(gr[row])
    in
        z
    • COIL-ibesmond's avatar
      COIL-ibesmond
      Icon for Helper I rankHelper I

      AlienSx For some reason it is only producing the first record.   I have a bunch of columns with nulls in both rows.  I pasted some more sample data that better reflects my dataset.  Any ideas how I could modify your M code to produce the desired results?

       

      ID RecordIDATETYPETitleStatusCategoryDescriptionLC2LC3LTAGATVTSLORNumberTimeSVDate SBTime SBRBDERFIFARDTPR&RRAACIDRPERNICLLNRDSACTAAGCANSCCLSRSOUQRCDOAAOFAATTCNPONOFEWSEISINGRICUMCOCOQELILHRIKLVRFRVRFCLUIssue(s)ETIVGENTRVEPGCLERCLD
      31207-0011/5/2023ERPSBReviewHIDXXXXXXXBOBBP2512/31/1899 5:10:00 AMnullnullnullMS1/6/2023nullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullMedULMediumHTnull31207-002null7/25/2023nullnull
      nullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullCUFSABTP. SO.nullnullnullnull
      30104-0011/4/2023IDSClosedIXXXXXXXTCTY98312/31/1899 3:40:00 PMAL1/4/202312/31/1899 3:00:00 AMAL1/5/2023ALnullVMUCYesYesCM1/4/2023BAPC623RW10FFOHISWnullnullnullnullnullnullnullnullnullnullNonullnullnullnullTPCA30223-0011/4/20231/4/20233/30/20233/30/2023
      nullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullVSC.nullnullnullnull
      30105-0011/5/2023PREROFOClosedIXXXXXXXnullLYTO22712/31/1899 7:00:00 PMHB1/5/202312/31/1899 4:00:00 AMHB1/6/2023HBnullnullNonullnullnullnullnullnullnullnullnullFMTCTTR201010nullnullnullnullnullnullnullnullnullTPCA30213-0051/5/20231/5/20232/15/20232/15/2023
      nullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullOOT. SC.nullnullnullnull
      nullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnull; A30228-001nullnullnullnull
      nullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullVWI. SC.nullnullnullnull
      30105-0021/6/2023ISWLCClosedIXXXXXXXnullWLEOBnull12/31/1899 11:10:00 AMMAnullnullBH1/6/2023BHnullnullNonullnullnullnullnullnullSLFSSRnullnullnullnullnullnullnullnullnullnullYesnullMedULHighRACA30106-0011/6/20236/25/20237/7/20237/7/2023
      nullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullPSADTLCAN. SC.nullnullnullnull
  • COIL-ibesmond try this

    let
        Source = your_table,
        f = (tbl) => 
            [lst = List.Skip(tbl[#"Issue(s)"]),
            res = tbl{0} & [Reason = lst{0}?, Issue ID = Text.Remove(lst{1}?, {" ", ";"}), Reason 2 = lst{2}?]
            ][res],        
        gr = Table.Group(
            Source, "IDATE", {{"row", f}},
            GroupKind.Local, (s, c) => Byte.From(Value.Is(c, DateTime.Type))
        ),
        z = Table.FromRecords(gr[row])
    in
        z
  • dufoq3's avatar
    dufoq3
    Icon for Community Champion rankCommunity Champion

    Hi COIL-ibesmond,

    Result:

     

    let
        Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("tVZda9tAEPwrws8B3e7d3gd9StMWAokpNG0eTB6CdWkNqWUkJ6H/vrunyD6Dc1YKfbAlSyvNzezsnBeLGWANNSrUs7MZKYt8uDjnL0QFlo+BFBm5yYU0Fl5/BERHMLs7W8wqvnDs8+3XarOJTbVtq5euXf+s7pumi31ffKj6UPHLrfXOFuvm8aXadG3ztNxW6xib2KRyU6PbsbG8QGZzI2y0twMbh144cqHP2DiFUAb8OoK1B4AsSdgBOicY3xOgAzIC6KzVsgx7qF7wSEW82yTZaht/V/0g5ATdIDgoN+UN3WwNdkcDUr+vkgusp6Sb93w30QCX8SA0ocxj1K2JD3G5XT3HV9lg7zqTXHeb8IIF+RFMsCj6cSFmeMyQTyf1KT7H7kA6U++tQU4ON3OB9AGUQCpFFJI1cmcYZ0906jjD043yJ6eHSey6NbZp7zalRakvV8KBlEkcDJJTqU1o8zYR2VCEu1wv267j9Vfnk6c0eAqnSaQIeGlHHsOLQdV7IuT3/dfGeSEC5JXjEy4EnTPhuVGT2tHFh6eesds1d+aR29L9Sc9hbnWCsJtYIBfSxGqTfMC+gwzZG08T2b4/8JTSAYt116u+X/E7czuwOGZHBUkOQ3ZrH9IUuWCMeVUx56J80GU//IupNQVVDtGjpvZ5hAYn651fpMFUSpIzIOohFOrcCdpoW866NyKblcgi24rdri8Fz/CeJjAafRoiLgQ68F6w7n85wAOH6YQdYQzvw2TDfZhq4fBjcLTyaQ/yHpxcNQd7kLUqlE3w6WnzuFreb+NRVAnmNEk4NE4km39O9lNm2DQMKJqlvw4axkrZ/fypODrm9rJ+DnCipV85VH3c3HdM7pFz4e4v", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [#"Date Started" = _t, #"ID Record" = _t, Location = _t, #"Client ID" = _t, #"Product ID" = _t, #"Date Ended" = _t, #"Issue(s)" = _t]),
        ReplaceBlankWithNull = Table.ReplaceValue(Source, null, null, (x,y,z)=> if Text.Trim(x) = "" then null else x, Table.ColumnNames(Source)),
        FilledDown = Table.FillDown(ReplaceBlankWithNull,Table.ColumnNames(Source)),
        TrimmedIssues = Table.TransformColumns(FilledDown,{{"Issue(s)", each Text.Trim(_, {";", " "}), type text}}),
        GroupedRows = Table.Group(TrimmedIssues, {"Date Started", "ID Record", "Location", "Client ID", "Product ID", "Date Ended"}, {{"Combine", each Text.Combine([#"Issue(s)"], ";")}}),
        SplitColumnByDelimiter = Table.SplitColumn(GroupedRows, "Combine", Splitter.SplitTextByDelimiter(";", QuoteStyle.Csv), {"Issues(s)", "Reason", "Issue ID", "Reason 2"})
    in
        SplitColumnByDelimiter