Forum Discussion

leolapa_br's avatar
leolapa_br
Resolver II
2 years ago
Solved

Get values from a temporary table variable

Below is a piece of the fact table 'fTrans' that provides context to my question.

 

TickerDateSale date related to respective purchaseDaysTransactionShares PricePurchase total
ABEV301/Mar/202104/Jun/202195Purchase77$12.93$995.61
ABEV304/May/202104/Jun/202131Purchase73$13.60$992.80
ABEV304/Jun/2021  Sale150$17.91 
ABEV328/Jun/202129/Oct/2021123Purchase62$16.01$992.62
ABEV329/Oct/2021  Sale62$15.62 
ALSO307/Jan/202103/Feb/202127Purchase39$25.12$979.68
ALSO303/Feb/2021  Sale39$27.20 
ALSO329/Jun/202130/Mar/2022274Purchase36$27.53$991.08
ALSO307/Jan/202230/Mar/202282Purchase56$17.85$999.60
ALSO330/Mar/2022  Sale92$22.61 
APER318/Nov/202122/Dec/202134Purchase33$29.88$986.04
APER322/Dec/2021  Sale33$33.40 
APER314/Jun/202211/Aug/202258Purchase34$29.14$990.76
APER304/Aug/202211/Aug/20227Purchase42$23.57$989.94
APER311/Aug/2022  Sale76$30.33 

 

As you can see for all rows whose [Transaction] column is a "Sale" the [Days] column has empty values.

 

The reason being that there are cases where a "Sale" transaction relates to more than one previous "Purchase" transaction, therefore a weighted average of [Days] needs to be calculated for those "Sale" rows.

 

So, my goal is to write up a measure that will provide a weighted average of [Days] for every [Transaction] "Sale" rows that are currently sitting empty, and in order to get there I started with this:

 

EVALUATE
VAR Supp_Tbl = 
	ADDCOLUMNS( 
		SUMMARIZE( 
			fTrans, 
			fTrans[Ticker], 
			fTrans[Date], 
			fTrans[Sale date related to respective purchase], 
			fTrans[Transaction], 
			"@Days", SUMX( 
				fTrans, 
				IF( 
					fTrans[Transaction] = "Sale", 
					BLANK(), 
					INT( fTrans[Sale date related to respective purchase] - fTrans[Date] ) 
				) 
			), 
			"@PurchTotal", [Purchase total] 
		), 
		"@WghtProdDaysPurch", [@Days] * [@PurchTotal] 
	)
VAR Days_Tbl = 
	ADDCOLUMNS( 
		GROUPBY( 
			Supp_Tbl, 
			fTrans[Ticker], 
			fTrans[Sale date related to respective purchase], 
			"@SumPurchTotal", SUMX( 
				CURRENTGROUP(), 
				[@PurchTotal] 
			), 
			"@SumWghtProdDaysPurch", SUMX( 
				CURRENTGROUP(), 
				[@WghtProdDaysPurch] 
			) 
		), 
		"@WghtdAvgDays", INT( 
				DIVIDE( 
				[@SumWghtProdDaysPurch], 
				[@SumPurchTotal] 
			) 
		) 
	)
RETURN
Days_Tbl

 

And it returns the following temporary table VAR "Days_Tbl" whose highlighted [@WghtdAvgDays] provides said weighted average of [Days] that I need for those "Sale" transaction rows:

 

TickerSale date related to respective purchase@SumPurchTotal@SumWghtProdDaysPurch@WghtdAvgDays
ABEV3    
ABEV304/Jun/20211,988.41125,359.7563
ABEV329/Out/2021992.62122,092.26123
ALSO3    
ALSO303/Feb/2021979.6826,451.3627
ALSO330/Mar/20221,990.68353,523.12177
APER3    
APER322/Dec/2021986.0433,525.3634
APER311/Aug/20221,980.764,393.6632

 

Now all I need is to get those values from [@WghtdAvgDays] under VAR "Days_Tbl" whenever [Sale date related to respective purchase] matches fTrans[Date] under each [Ticker].

 

And for that I first tried by writing the following code:

 

LOOKUPVALUE( 
	[@WghtdAvgDays], 
	fTrans[Sale date related to respective purchase], 
	MAXX( 
		FILTER( 
			fTrans, 
			fTrans[Ticker] = EARLIER( fTrans[Ticker] ) && 
			fTrans[Date] = EARLIER( fTrans[Date] ) && 
			fTrans[Transaction] = "Sale" 
		), 
		fTrans[Date] 
	) 
)

 

But it right off the bat presents two issues:

  1. The column 'fTrans[Sale date related to respective purchase]' either doesn't exist or doesn't have a relationship to any table available in the current context (message given by PBI when committing the measure code).
  2. [@WghtdAvgDays] can't be used as the first argument of LOOKUPVALUE as it expects a fully qualified column (message provided by DAX Studio while attempting to troubleshoot the code).

How am I supposed to get the values from the [@WghtdAvgDays] column under the temporary table VAR "Days_Tbl" then?

 

Thanks in advance...

 

P.S.:

I also tried the route of creating a third temp table with SUMMARIZECOLUMNS but it ends up aggregating the overall total of [Days] for all rows:

 

FILTER( 
	SUMMARIZECOLUMNS( 
		fTrans[Ticker], 
		fTrans[Date], 
		fTrans[Transaction], 
		"@Days", CALCULATE( 
			SUMX( 
				Days_Tbl, 
				[@WghtdAvgDays] 
			), 
		fTrans[Sale date related to respective purchase] = fTrans[Date] 
		) 
	), 
	fTrans[Transaction] = "Sale" 
)

 

TickerDateTransactionDays
ABEV304/Jun/2021Sale30,080
ABEV329/Out/2021Sale30,080
ALSO303/Feb/2021Sale30,080
ALSO330/Mar/2022Sale30,080
APER322/Dec/2021Sale30,080
APER311/Aug/2022Sale 30,080

 

  • lbendlin your approach sure provided the stepping stones for helping me get across the finish line.

     

    Thanks very much for your valuable input!

     

    Just a couple of tweaks to your code were needed to reach the goal:

    • [Days] and [Purchase total] are measures instead of columns of table 'fTrans', so all it was needed was to remove 'fTrans' from both within SUMX.
    • Your calculation provides the equivalent in Excel of a SUMPRODUCT between [Days] and [Purchase total], so all it was needed in order to get a proper weighted average of [Days] was to divide that by the SUM of [Purchase total], and I did that by wrapping it around CALCULATE with the same filters (at least to me it somewhat looked odd a CALCULATE within another CALCULATE, but that's the only way I know how to do it for that particular case - perhaps creating a VAR for that would be more within the best practice guidelines).

    So the final code looks as follows:

     

    Table = 
    	ADDCOLUMNS( 
    		SUMMARIZE( 
    			FILTER( 
    				fTrans, 
    				fTrans[Transaction] = "Sale" 
    			), 
    			fTrans[Ticker],
    			fTrans[Date] 
    		), 
    		"WavgDays", 
    		VAR Ticker_Ref = [Ticker]
    		VAR Date_Ref = [Date]
    		RETURN
    			CALCULATE( 
    				SUMX( fTrans,
    					DIVIDE( 
    						[Days] * [Purchase total], 
    						CALCULATE( 
    								[Purchase total], 
    							ALL( fTrans ), 
    							fTrans[Ticker] = Ticker_Ref, 
    							fTrans[Sale date related to respective purchase] = Date_Ref 
    						)
    					)
    				), 
    				ALL( fTrans ), 
    				fTrans[Ticker] = Ticker_Ref, 
    				fTrans[Sale date related to respective purchase] = Date_Ref 
    			) 
    		)

     

    Thanks!

13 Replies

  • I would run this the other way round, starting with the Sale dates.

     

    I don't think you need a measure for this - the results don't seem to be impacted by user filter choices.

     

    Table = ADDCOLUMNS(SUMMARIZE(FILTER(fTrans,[Transaction]="Sale"),[Ticker],[Date]),"WavgDays",var t = [Ticker] var d=[Date] return CALCULATE(sumx(fTrans,fTrans[Days]*fTrans[Purchase total]),all(fTrans),fTrans[Ticker]=t,fTrans[Sale date related to respective purchase]=d))

     

     

    • leolapa_br's avatar
      leolapa_br
      Resolver II

      lbendlin 

       

      I created a measure that would allow me to plop that [WavgDays] column from your calculated table in whatever visual I may need (on the case below, a simple table), but I always keep getting the overall total of days:

       

      TickerDateDaysTransactionSharesPricePurchase totalDays average 1Days average 2
      ABEV301/Mar/202195Purchase77$12.93$995.61  
      ABEV304/May/202131Purchase73$13.60$992.80  
      ABEV304/Jun/2021 Sale150$17.91 29,36029,360
      ABEV328/Jun/2021123Purchase62$16.01$992.62  
      ABEV329/Oct/2021 Sale62$15.62 29,36029,360
      ALSO307/Jan/202127Purchase39$25.12$979.68  
      ALSO303/Feb/2021 Sale39$27.20 29,36029,360
      ALSO329/Jun/2021274Purchase36$27.53$991.08  
      ALSO307/Jan/202282Purchase56$17.85$999.60  
      ALSO330/Mar/2022 Sale92$22.61 29,36029,360
      APER318/Nov/202134Purchase33$29.88$986.04  
      APER322/Dec/2021 Sale33$33.40 29,36029,360
      APER314/Jun/202258Purchase34$29.14$990.76  
      APER304/Aug/20227Purchase42$23.57$989.94  
      APER311/Aug/2022 Sale76$30.33 29,36029,360

       

      I tried both these codes to no success.

       

      Days average 1 = 
      IF( 
          VALUES( fTrans[Transaction] ) = "Sale", 
          SUMX( 
              fWavgDays, 
              fWavgDays[WavgDays] 
          ) 
      )
      ___________________________________________________________
      Days average 2 = 
      VAR Ticker_Ref = VALUES( fTrans[Ticker] )
      VAR Date_Ref = VALUES( fTrans[Date] )
      RETURN
      CALCULATE( 
          IF( 
              VALUES( fTrans[Transaction] ) = "Sale", 
              SUM( fWavgDays[WavgDays] ) 
          ), 
          fTrans[Ticker] = Ticker_Ref, 
          fTrans[Date] = Date_Ref 
      )

       

      What am I doing wrong?

      • lbendlin's avatar
        lbendlin
        Super User
        [Days] and [Purchase total] are measures instead of columns of table 'fTrans', so all it was needed was to remove 'fTrans' from both within SUMX.

        why?

  • lbendlin your approach sure provided the stepping stones for helping me get across the finish line.

     

    Thanks very much for your valuable input!

     

    Just a couple of tweaks to your code were needed to reach the goal:

    • [Days] and [Purchase total] are measures instead of columns of table 'fTrans', so all it was needed was to remove 'fTrans' from both within SUMX.
    • Your calculation provides the equivalent in Excel of a SUMPRODUCT between [Days] and [Purchase total], so all it was needed in order to get a proper weighted average of [Days] was to divide that by the SUM of [Purchase total], and I did that by wrapping it around CALCULATE with the same filters (at least to me it somewhat looked odd a CALCULATE within another CALCULATE, but that's the only way I know how to do it for that particular case - perhaps creating a VAR for that would be more within the best practice guidelines).

    So the final code looks as follows:

     

    Table = 
    	ADDCOLUMNS( 
    		SUMMARIZE( 
    			FILTER( 
    				fTrans, 
    				fTrans[Transaction] = "Sale" 
    			), 
    			fTrans[Ticker],
    			fTrans[Date] 
    		), 
    		"WavgDays", 
    		VAR Ticker_Ref = [Ticker]
    		VAR Date_Ref = [Date]
    		RETURN
    			CALCULATE( 
    				SUMX( fTrans,
    					DIVIDE( 
    						[Days] * [Purchase total], 
    						CALCULATE( 
    								[Purchase total], 
    							ALL( fTrans ), 
    							fTrans[Ticker] = Ticker_Ref, 
    							fTrans[Sale date related to respective purchase] = Date_Ref 
    						)
    					)
    				), 
    				ALL( fTrans ), 
    				fTrans[Ticker] = Ticker_Ref, 
    				fTrans[Sale date related to respective purchase] = Date_Ref 
    			) 
    		)

     

    Thanks!