Forum Discussion

sumanthdk's avatar
sumanthdk
New Member
2 years ago
Solved

Converting distinct rows to Columns based on criteria

Hi,

I have the following data set - 

 

MonthYearCategorySub CategoryValue
January2023PurchaseInventory$50.00
January2023PurchaseEquipment$200
February2023GoodsInwards$100
March2023ITProcurement$1000

 

How do I convert the above data set to - 

CategorySub CategoryJanuaryFebruaryMarchAprilMayYear  
PurchaseInventory50    2023  
PurchaseEquipment200    2023  
GoodsInwards 100   2023  
ITProcurement  1000  2023  

 

I have a table which is 20000 rows with historical data from 2010. Basically looking to categorise by different months (columns) and the category/sub category as rows. 

 

Looking for a solution in Power Query. 

 

Thank you for your help.

  • Hi sumanthdk 

     

    This is certainly not a best practice, and exclusive to Excel reporting alone, I would say.

    Nonetheless, it can be done entirely through the User Interface; here is the pattern.

    let
        Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45W8krMK00sqlTSUTIyMDIGUgGlRckZicWpQKZnXllqXkk+WNbUQClWB79y18LSzIJcoA6wLES9W2pSEaoG9/z8lGKw4eWJRWCWIVStbyLQKIRCzxCQ8UX5yaVFqVBTgSqBSmMB", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Month = _t, Year = _t, Category = _t, #"Sub Category" = _t, Value = _t]),
        ChType = Table.TransformColumnTypes(Source,{{"Value", Currency.Type}}),
        MergeCols = Table.CombineColumns(ChType,{"Year", "Category", "Sub Category"},Combiner.CombineTextByDelimiter("|", QuoteStyle.None),"Merged"),
        PivotCol = Table.Pivot(MergeCols, List.Distinct(MergeCols[Month]), "Month", "Value", List.Sum),
        SplitByDelimiter = Table.SplitColumn(PivotCol, "Merged", Splitter.SplitTextByDelimiter("|", QuoteStyle.Csv), {"Year", "Category", "Sub Category"})
    in
        SplitByDelimiter

    I hope this is helpful

2 Replies

  • m_dekorte's avatar
    m_dekorte
    Resident Rockstar

    Hi sumanthdk 

     

    This is certainly not a best practice, and exclusive to Excel reporting alone, I would say.

    Nonetheless, it can be done entirely through the User Interface; here is the pattern.

    let
        Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45W8krMK00sqlTSUTIyMDIGUgGlRckZicWpQKZnXllqXkk+WNbUQClWB79y18LSzIJcoA6wLES9W2pSEaoG9/z8lGKw4eWJRWCWIVStbyLQKIRCzxCQ8UX5yaVFqVBTgSqBSmMB", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Month = _t, Year = _t, Category = _t, #"Sub Category" = _t, Value = _t]),
        ChType = Table.TransformColumnTypes(Source,{{"Value", Currency.Type}}),
        MergeCols = Table.CombineColumns(ChType,{"Year", "Category", "Sub Category"},Combiner.CombineTextByDelimiter("|", QuoteStyle.None),"Merged"),
        PivotCol = Table.Pivot(MergeCols, List.Distinct(MergeCols[Month]), "Month", "Value", List.Sum),
        SplitByDelimiter = Table.SplitColumn(PivotCol, "Merged", Splitter.SplitTextByDelimiter("|", QuoteStyle.Csv), {"Year", "Category", "Sub Category"})
    in
        SplitByDelimiter

    I hope this is helpful

    • sumanthdk's avatar
      sumanthdk
      New Member

      m_dekorte  - thank you so much. had to make some minor modifications to adjust to my working environment. but works eventually. 

      as a novice to power query myself, why would you say this is not best practice? if so what would be your approach?

      thanks again.