Forum Discussion
Get values from a temporary table variable
Below is a piece of the fact table 'fTrans' that provides context to my question.
| Ticker | Date | Sale date related to respective purchase | Days | Transaction | Shares | Price | Purchase total |
| ABEV3 | 01/Mar/2021 | 04/Jun/2021 | 95 | Purchase | 77 | $12.93 | $995.61 |
| ABEV3 | 04/May/2021 | 04/Jun/2021 | 31 | Purchase | 73 | $13.60 | $992.80 |
| ABEV3 | 04/Jun/2021 | Sale | 150 | $17.91 | |||
| ABEV3 | 28/Jun/2021 | 29/Oct/2021 | 123 | Purchase | 62 | $16.01 | $992.62 |
| ABEV3 | 29/Oct/2021 | Sale | 62 | $15.62 | |||
| ALSO3 | 07/Jan/2021 | 03/Feb/2021 | 27 | Purchase | 39 | $25.12 | $979.68 |
| ALSO3 | 03/Feb/2021 | Sale | 39 | $27.20 | |||
| ALSO3 | 29/Jun/2021 | 30/Mar/2022 | 274 | Purchase | 36 | $27.53 | $991.08 |
| ALSO3 | 07/Jan/2022 | 30/Mar/2022 | 82 | Purchase | 56 | $17.85 | $999.60 |
| ALSO3 | 30/Mar/2022 | Sale | 92 | $22.61 | |||
| APER3 | 18/Nov/2021 | 22/Dec/2021 | 34 | Purchase | 33 | $29.88 | $986.04 |
| APER3 | 22/Dec/2021 | Sale | 33 | $33.40 | |||
| APER3 | 14/Jun/2022 | 11/Aug/2022 | 58 | Purchase | 34 | $29.14 | $990.76 |
| APER3 | 04/Aug/2022 | 11/Aug/2022 | 7 | Purchase | 42 | $23.57 | $989.94 |
| APER3 | 11/Aug/2022 | Sale | 76 | $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:
| Ticker | Sale date related to respective purchase | @SumPurchTotal | @SumWghtProdDaysPurch | @WghtdAvgDays |
| ABEV3 | ||||
| ABEV3 | 04/Jun/2021 | 1,988.41 | 125,359.75 | 63 |
| ABEV3 | 29/Out/2021 | 992.62 | 122,092.26 | 123 |
| ALSO3 | ||||
| ALSO3 | 03/Feb/2021 | 979.68 | 26,451.36 | 27 |
| ALSO3 | 30/Mar/2022 | 1,990.68 | 353,523.12 | 177 |
| APER3 | ||||
| APER3 | 22/Dec/2021 | 986.04 | 33,525.36 | 34 |
| APER3 | 11/Aug/2022 | 1,980.7 | 64,393.66 | 32 |
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:
- 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).
- [@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"
)
| Ticker | Date | Transaction | Days |
| ABEV3 | 04/Jun/2021 | Sale | 30,080 |
| ABEV3 | 29/Out/2021 | Sale | 30,080 |
| ALSO3 | 03/Feb/2021 | Sale | 30,080 |
| ALSO3 | 30/Mar/2022 | Sale | 30,080 |
| APER3 | 22/Dec/2021 | Sale | 30,080 |
| APER3 | 11/Aug/2022 | Sale | 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
- lbendlinSuper User
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_brResolver II
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:
Ticker Date Days Transaction Shares Price Purchase total Days average 1 Days average 2 ABEV3 01/Mar/2021 95 Purchase 77 $12.93 $995.61 ABEV3 04/May/2021 31 Purchase 73 $13.60 $992.80 ABEV3 04/Jun/2021 Sale 150 $17.91 29,360 29,360 ABEV3 28/Jun/2021 123 Purchase 62 $16.01 $992.62 ABEV3 29/Oct/2021 Sale 62 $15.62 29,360 29,360 ALSO3 07/Jan/2021 27 Purchase 39 $25.12 $979.68 ALSO3 03/Feb/2021 Sale 39 $27.20 29,360 29,360 ALSO3 29/Jun/2021 274 Purchase 36 $27.53 $991.08 ALSO3 07/Jan/2022 82 Purchase 56 $17.85 $999.60 ALSO3 30/Mar/2022 Sale 92 $22.61 29,360 29,360 APER3 18/Nov/2021 34 Purchase 33 $29.88 $986.04 APER3 22/Dec/2021 Sale 33 $33.40 29,360 29,360 APER3 14/Jun/2022 58 Purchase 34 $29.14 $990.76 APER3 04/Aug/2022 7 Purchase 42 $23.57 $989.94 APER3 11/Aug/2022 Sale 76 $30.33 29,360 29,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?
- lbendlinSuper 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?
- leolapa_brResolver II
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!