Forum Discussion

Girts's avatar
Girts
Frequent Visitor
8 years ago
Solved

Calculate grouped values based on criteria

I am new in Power BI, read a lot of different solutions in web, but couldn't get a result. 

Source data comes from financial accounts + analytical dimensions. 
For this post created table with dummy values.

YearCostCenterExp-IncMonth01Month02Month03
2017Company ASales100150124
2017Company ASalary505050
2017Company AOther costs202020
2017Company BSales150225186
2017Company BSalary757575
2017Company BOther costs303030
2018Company ASales120180149
2018Company ASalary606060
2018Company AOther costs242424
2018Company BSales188281233
2018Company BSalary949494
2018Company BOther costs383838

 

The wish is to get calculated values in rows by each year, company(CostCenter) and month. 
It should look like: 

YearCostCenterExp-IncMonth01Month02Month03
2017Company ASales100150124
2017Company ASalary505050
2017Company AProfit before other costs5010074
2017Company A%50%67%60%
2017Company AOther costs202020
2017Company AProfit308054
2017Company A%30%53%44%
  • Hello,

     

    you know for starters it is a really hard request.

     

    First Step: You have to Unpivot your FactTable using PowerQuery

    let
        Source = Excel.CurrentWorkbook(){[Name="FactTable"]}[Content],
        #"Changed Type" = Table.TransformColumnTypes(Source,{{"Year", Int64.Type}, {"CostCenter", type text}, {"Exp-Inc", type text}, {"Month01", Int64.Type}, {"Month02", Int64.Type}, {"Month03", Int64.Type}}),
        Unpivot_Month = Table.UnpivotOtherColumns(#"Changed Type", {"Exp-Inc", "CostCenter", "Year"}, "Attribut", "Wert"),
        Add_MonthNumb = Table.AddColumn(Unpivot_Month, "MonthNumb", each Text.End([Attribut],2)),
        Change_MonthNumb = Table.TransformColumnTypes(Add_MonthNumb,{{"MonthNumb", Int64.Type}})
    in
        Change_MonthNumb

    The result is a table looking like this:

     

    After loading this to your Data Model you have to create a Dimension Table (DimTable):

     

    Exp-IncIDID
    Sales1
    Salary2
    Profit before other costs3
    % PBOC4
    Other costs5
    Profit6
    % Profit7

     

    In your DimTable you create the following Measure:

    Value:=
    IF(HASONEVALUE(DimTable[Exp-Inc]); VAR Sales=CALCULATE(SUM(FactTable[Wert]);FactTable[Exp-Inc]="Sales") VAR Salary=CALCULATE(SUM(FactTable[Wert]);FactTable[Exp-Inc]="Salary") VAR Others=CALCULATE(SUM(FactTable[Wert]);FactTable[Exp-Inc]="Other costs") VAR Gross_Profit=Sales-Salary VAR Switch_Measure= SWITCH(MAX(DimTable[ID]); 1;Sales; 2;Salary; 3;Gross_Profit; 4;DIVIDE(Gross_Profit;Sales); 5;Others; 6;Gross_Profit-Others; 7;DIVIDE((Gross_Profit-Others);Sales)) RETURN IF(OR(MAX(DimTable[ID])=4;MAX(DimTable[ID])=7); FORMAT(Switch_Measure;"0%"); FORMAT(Switch_Measure;"0")); BLANK())

    It may be possible you have to change ";" to ",", according to my non-englisch version.

     

    The result is the following:

     

    There are dozens of great posts and blogs explaining SWITCH and VAR like:
    Paramter Table, VAR 1, VAR 2, and my previous blog for SWITCH.

     

    You could also try to solve your problem through cascading like here.

     

    Best regards.

4 Replies

  • Hello,

     

    you know for starters it is a really hard request.

     

    First Step: You have to Unpivot your FactTable using PowerQuery

    let
        Source = Excel.CurrentWorkbook(){[Name="FactTable"]}[Content],
        #"Changed Type" = Table.TransformColumnTypes(Source,{{"Year", Int64.Type}, {"CostCenter", type text}, {"Exp-Inc", type text}, {"Month01", Int64.Type}, {"Month02", Int64.Type}, {"Month03", Int64.Type}}),
        Unpivot_Month = Table.UnpivotOtherColumns(#"Changed Type", {"Exp-Inc", "CostCenter", "Year"}, "Attribut", "Wert"),
        Add_MonthNumb = Table.AddColumn(Unpivot_Month, "MonthNumb", each Text.End([Attribut],2)),
        Change_MonthNumb = Table.TransformColumnTypes(Add_MonthNumb,{{"MonthNumb", Int64.Type}})
    in
        Change_MonthNumb

    The result is a table looking like this:

     

    After loading this to your Data Model you have to create a Dimension Table (DimTable):

     

    Exp-IncIDID
    Sales1
    Salary2
    Profit before other costs3
    % PBOC4
    Other costs5
    Profit6
    % Profit7

     

    In your DimTable you create the following Measure:

    Value:=
    IF(HASONEVALUE(DimTable[Exp-Inc]); VAR Sales=CALCULATE(SUM(FactTable[Wert]);FactTable[Exp-Inc]="Sales") VAR Salary=CALCULATE(SUM(FactTable[Wert]);FactTable[Exp-Inc]="Salary") VAR Others=CALCULATE(SUM(FactTable[Wert]);FactTable[Exp-Inc]="Other costs") VAR Gross_Profit=Sales-Salary VAR Switch_Measure= SWITCH(MAX(DimTable[ID]); 1;Sales; 2;Salary; 3;Gross_Profit; 4;DIVIDE(Gross_Profit;Sales); 5;Others; 6;Gross_Profit-Others; 7;DIVIDE((Gross_Profit-Others);Sales)) RETURN IF(OR(MAX(DimTable[ID])=4;MAX(DimTable[ID])=7); FORMAT(Switch_Measure;"0%"); FORMAT(Switch_Measure;"0")); BLANK())

    It may be possible you have to change ";" to ",", according to my non-englisch version.

     

    The result is the following:

     

    There are dozens of great posts and blogs explaining SWITCH and VAR like:
    Paramter Table, VAR 1, VAR 2, and my previous blog for SWITCH.

     

    You could also try to solve your problem through cascading like here.

     

    Best regards.

    • Girts's avatar
      Girts
      Frequent Visitor

      Thank you for your answer. Bookmarked it in my browser :robothappy:

       

      ... modified ... Why did you add a custom column for MonthNumber?

       

      ... about variable Switch_Measure - As I understand, it was used to get right format for % values?

      • Floriankx's avatar
        Floriankx
        Icon for Solution Sage rankSolution Sage

        Hello,

         

        MonthNumb is obsolete, I expected it to be needed but it wasn't the case.

         

        Switch was used to get the required structure of Values. Because some are calculated and others aren't.

         

        The Format I defined in the IF-Statement.

         

        Best regards.