Forum Discussion

Rehansaeed2024's avatar
Rehansaeed2024
Frequent Visitor
9 months ago
Solved

Excel Calc in Power BI

HOw to code this excel formula in Power BI SUMPRODUCT(C$2:C3,(1-$K$4)^(ROW(C3)-ROW(C$2:C3)))

 

The row index is caclulated on the fly based on teh user selection so I do have the Row index aleready generated using the below DAX.

 

Product IDOrder Date Product Cost Numerator (Expected)Denominator (DONE)
600554231/2/2024            8,868,094.35  
600561341/2/2024            7,629,201.4316,184,984.961.964783
600585141/2/2024            5,618,481.3321,233,473.952.895589237
600558451/5/2024          13,441,244.8833,926,932.063.793615271
600563801/5/2024            2,053,174.3534,785,289.634.660015522
600591831/5/2024            9,238,017.7342,798,261.505.495903755
600583771/10/2024            9,470,897.0650,761,917.046.302354513
600519521/11/2024            9,820,500.2558,794,716.897.080404494
     
Denominator Excel Formula  = SUMPRODUCT((0.964783)^(ROW(C3)-ROW(C$2:C3))) Working ffine in PBI wthe below DAX Measure
VAR Alpha = 0.964783   
VAR CurrentIndex =[Row Index_Line_Items] This Is a measure 
     
-- first OrderIndex in the current filter context (e.g., current month, product set, etc.)
VAR MinIndex =    
    CALCULATE (   
          MINX ( ALLSELECTED('Table A'), [Row Index_Line_Items] ) 
            
    )    
     
VAR N = CurrentIndex - MinIndex+1  
RETURN    
IF (    
    ISBLANK ( CurrentIndex ) || ISBLANK ( MinIndex ) || N <= 0, 
    BLANK (),    
    ( 1 - POWER (Alpha, N ) )  / ( 1 -Alpha )  
   )    
     
Numerator Formula    = SUMPRODUCT(C$2:C3,(1-$K$4)^(ROW(C3)-ROW(C$2:C3))) 
??    
  • Anonymous's avatar
    Anonymous
    8 months ago

    Hi Rehansaeed2024 ,
    Thanks for confirming that the results are matching in the reference PBIX. This confirms that the Excel decayed
    SUMPRODUCT logic is correctly implemented in Power BI using DAX.

    The issues you are facing in your actual PBIX are not due to the formula, but mainly because of model structure and data size. The circular dependency error usually comes when a measure like Numerator_Decayed is used directly or indirectly inside a calculated column, or when the Row Index itself is created using measures. In the working PBIX, the Row Index is a simple calculated column, and both Numerator and Denominator are measures only, which avoids this issue.

    The “Query exceeded available resources” message happens when the SUMX + FILTER logic runs over a very large or highly detailed dataset. In such cases, the data grain or Row Index scope needs to be reduced to improve performance.

    When you see 0.00 values for smaller datasets, it usually means the Row Index is not stable or the table is not sorted in the same order as Excel before assigning the index. Since Excel’s ROW() depends on position, sorting is very important.

    Please use the attached PBIX as a reference for how the Row Index and measures should be structured. Once the same separation and sorting are applied in your actual model, the Numerator_Decayed will behave exactly the same as Excel.

     

19 Replies

  • Hello Rehansaeed2024 ,

     

    Try this :

    VAR Alpha = 0.964783
    VAR CurrentIndex = [Row Index_Line_Items]
    
    VAR MinIndex =
        CALCULATE (
            MIN ( 'Table A'[Row Index_Line_Items] ),
            ALLSELECTED ( 'Table A' )
        )
    
    RETURN
    SUMX (
        FILTER (
            ALLSELECTED ( 'Table A' ),
            'Table A'[Row Index_Line_Items] >= MinIndex
                && 'Table A'[Row Index_Line_Items] <= CurrentIndex
        ),
        'Table A'[Product Cost]
            * POWER (
                (1 - Alpha),
                CurrentIndex - 'Table A'[Row Index_Line_Items]
            )
    )

     

    Row Index_Line_Items must be unique

     

     

  • Anonymous's avatar
    Anonymous
    Not applicable

    Hi Rehansaeed2024 ,

    DAX MEASURE  Numerator Equivalent

     

    Assuming:

     

    [Row Index_Line_Items] = your sequential row index measure

     

    'Table A'[Product Cost] = C column

     

    Alpha = 0.964783

     

    DAX measure.

     

    Numerator =

    VAR Alpha = 0.964783

    VAR OneMinusAlpha = 1 - Alpha

     

    VAR CurrentIndex =

        [Row Index_Line_Items]

     

    VAR MinIndex =

        CALCULATE(

            MINX(ALLSELECTED('Table A'), [Row Index_Line_Items])

        )

     

    RETURN

    IF(

        ISBLANK(CurrentIndex) || ISBLANK(MinIndex),

        BLANK(),

        CALCULATE(

            SUMX(

                FILTER(

                    ALLSELECTED('Table A'),

                    [Row Index_Line_Items] <= CurrentIndex

                ),

                'Table A'[Product Cost] *

                    POWER(

                        OneMinusAlpha,

                        CurrentIndex - [Row Index_Line_Items]

             

          )

            )

        )

    )

     

    If my response as resolved your issue please mark it as solution and give kudos.

  • Hi,

    Share the download link of the MS Excel file with your formulas already written there so that i can clearly udnerstand your logic.

  • Anonymous's avatar
    Anonymous
    Not applicable

    Hi Rehansaeed2024 ,

    I've recreated your entire scenario in a new sample .pbix file to verify the behavior. After setting up the same tables, adding the Row Index, and applying the decay based numerator and denominator logic, I was able to reproduce the exact expected output on my side. Both the running numerator calculation and the denominator values are working correctly when the DAX measures are created under the LineItems table.

    This confirms that the logic you are using is valid, and Power BI calculates the decayed SUMPRODUCT pattern exactly as intended once the Row Index and Alpha value are set up properly. For your reference, I've attached the working .pbix file so you can compare it with your model and follow the steps used to get the final result.

     

      • Anonymous's avatar
        Anonymous
        Not applicable

        Hi Rehansaeed2024  ,

        To reproduce Excel’s decayed SUMPRODUCT logic in Power BI, I first created a stable Row Index column using RANKX in Table A and then brought it into Table B using Row Index_TableB = RELATED('Table A'[Row Index]). This gives Power BI the row-by-row context that Excel gets from ROW(). The denominator was already correct using Alpha = 0.964783. The numerator, which corresponds to SUMPRODUCT(C$2:C3, Alpha^(ROW(C3)-ROW(C$2:C3))), is implemented in DAX by summing all previous Product Cost values with decay based on the row distance:

        Numerator_Decayed :=
        VAR Alpha = 0.964783
        VAR CurrentIndex = SELECTEDVALUE('Table B'[Row Index_TableB])
        VAR MinIndex = CALCULATE(MINX(ALLSELECTED('Table B'), 'Table B'[Row Index_TableB]))
        RETURN
        IF(
        ISBLANK(CurrentIndex) || ISBLANK(MinIndex),
        BLANK(),
        CALCULATE(
        SUMX(
        FILTER(ALLSELECTED('Table B'), 'Table B'[Row Index_TableB] <= CurrentIndex),
        'Table B'[Product Cost] *
        POWER(Alpha, CurrentIndex - 'Table B'[Row Index_TableB])
        )
        )
        )
        The final weighted output is:

        Weighted_ProductCost :=
        DIVIDE([Numerator_Decayed], [Denominator])
        Once the Row Index column and these measures are applied, the Numerator and Weighted values match Excel’s SUMPRODUCT output exactly, fully solving the translation of the Excel formula into Power BI DAX.

         

  • Hello Rehansaeed2024 

    Try this



    Numerator :=
    VAR Alpha = 1 - 0.964783 -- If K4 = 0.964783, adjust as needed
    VAR CurrentIndex = [Row Index_Line_Items]

    RETURN
    IF(
    ISBLANK(CurrentIndex),
    BLANK(),
    CALCULATE(
    SUMX(
    ADDCOLUMNS(
    'Table A',
    "Weight",
    POWER(
    Alpha,
    CurrentIndex - [Row Index_Line_Items]
    ),
    "WeightedValue",
    'Table A'[Product Cost] *
    POWER(
    Alpha,
    CurrentIndex - [Row Index_Line_Items]
    )
    ),
    [WeightedValue]
    ),
    FILTER(
    ALLSELECTED('Table A'),
    [Row Index_Line_Items] <= CurrentIndex
    )
    )
    )