Forum Discussion

aisberg's avatar
aisberg
Frequent Visitor
6 years ago

DAX equivalent to PRODUCT() on a Measure in a variable context?

I need to calculate in a flexible context per day:

 

A_prod(day 1) = A(day 1)
A_prod(day 2) = A(day 1) * A(day 2)
A_prod(day 3) = A(day 1) * A(day 2) * A(day 3)

 

and so on.

If [A] would be a column, I could use PRODUCT(), for example this:

Measure A_prod := 
CALCULATE(
PRODUCT('table'[A]);
FILTER(
ALLSELECTED( 'table');
'table'[date] <= MAX('table'[date])
)
)

Calculating this for each date I would be near to my target. But this will work only on a colum 'table'[A] with fixed data. And my [A] is not a columns but a measure and it's value depends on the context.

To be less abstract:
[A] := SUM([B] * [C]) / SUM ([C])
but the elements to be included into the SUM depend on the content.

I tried to use ADDCOLUMNS on a SUMMARIZE table, but the context is not used in the calculations, SUMMARIZE table seams to be the same in any context.

ProdX 3 := 
CALCULATE(
PRODUCTX (
ADDCOLUMNS ( SUMMARIZE ( 'MG_Datum_Mandant_Portfolio', 'MG_Datum_Mandant_Portfolio'[Datum] ), "TWR", [TWR_PF_BW_x_Vol_share_VT div Vol_share_VT] ),
[TWR]
);
FILTER(
ALLSELECTED( 'MG_Datum_Mandant_Portfolio');
'MG_Datum_Mandant_Portfolio'[Datum] <= MAX('MG_Datum_Mandant_Portfolio'[Datum])
)
)

--with ProdX 4 I get the same result as in ProdX 3

ProdX 4 :=
CALCULATE(
PRODUCTX (
ADDCOLUMNS ( SUMMARIZE ( ALLSELECTED('MG_Datum_Mandant_Portfolio'), 'MG_Datum_Mandant_Portfolio'[Datum] ), "TWR", [TWR_PF_BW_x_Vol_share_VT div Vol_share_VT] ),
[TWR]
);
FILTER(
ALLSELECTED( 'MG_Datum_Mandant_Portfolio');
'MG_Datum_Mandant_Portfolio'[Datum] <= MAX('MG_Datum_Mandant_Portfolio'[Datum])
)
)

 

 

4 Replies

  • Anonymous's avatar
    Anonymous
    Not applicable

     

    // Try this. I wrote this blindly since I know nothing about
    // what the model is and what you're really trying to achieve...
    measure_ =
    var __maxDate = max( 'MG_Datum_Mandant_Portfolio'[Datum] )
    var __relevantDates =
    	FILTER(
    		ALLSELECTED ( 'MG_Datum_Mandant_Portfolio' ),
    		'MG_Datum_Mandant_Portfolio'[Datum] <= __maxDate
    	)
    return
    CALCULATE (
        PRODUCTX (
            ADDCOLUMNS (
                VALUES( 'MG_Datum_Mandant_Portfolio'[Datum] ),
                "TWR", [TWR_PF_BW_x_Vol_share_VT div Vol_share_VT]
            ),
            [TWR]
        ),
        __relevantDates
    )

     

    • Anonymous's avatar
      Anonymous
      Not applicable

      this worked for me, thanks! 😎

  • aisberg's avatar
    aisberg
    Frequent Visitor

    y error was the wrong usage of ALLSELECTED

    A good article is here: https://www.sqlbi.com/articles/the-definitive-guide-to-allselected/

    I did a test with COUNT and I understand my error, need to filter ALLSELECTED only the date filter, but not the table wich context is required.

     

    TWR_PF_BW Test01 =
    CALCULATE(
    COUNT('MG_Datum_Mandant_Portfolio_GroupBy'[TWR_PF_BW]);
    FILTER(
    ALLSELECTED( 'Datum');
    'Datum'[Datum] <= MAX('Datum'[Datum])
    )
    )