March 31 - April 2, 2025, in Las Vegas, Nevada. Use code MSCUST for a $150 discount! Early bird discount ends December 31.
Register NowBe one of the first to start using Fabric Databases. View on-demand sessions with database experts and the Microsoft product team to learn just how easy it is to get started. Watch now
Hi PBI gurus!
Thanks in advance for looking at this problem. My team and I have hired a PBI consultant but this stumped him as well. XLS and PBIX here: https://drive.google.com/drive/folders/11WZKuWiNRz7vYAKmY0SP0gRwj8-qWJjo?usp=sharing
Below is a set of mock investment data in one single table. For each Investment, we can buy shares (Purchase) or sell shares (Sale). From time to time the value of the entire Investment is revalued (Market Revaluation); not all Investments gets revalued however. The challenge for me is the Purchase and Sales amounts are marginal/transactional amounts, whereas the Market Revaluation is a balance at a moment in time.
Goal: The reader is able to select an ending date, and the visual (bar chart or card) shows the total value of that Investment at that date.
Example 1: How much is Happy Investment worth at January 3rd, 2022?
The solution should add the latest Market Revaluation at Dec 31, 2021 (opening balance) to any purchases and sales subsequent to that but not to exceed the specified date of January 3rd. In this case on January 1st, 2022 we bought $40,041 worth of Happy Investment, which should be added.
921,198 + 40,041 = 961,239
Example 2: How much is Sad Investment worth at Jun 27, 2022?
Since there is no Market Revaluation before Jun 27, 2022, the total value should aggregate all Purchase and Sales until that date (ie. opening balance is 0).
1,700,000 - 61,877 + 49,570 = 1,687,693
What I have tried after spending time on these forums, google and youtube:
Solved! Go to Solution.
You have a typo at line 22, you're comparing 'Data'[Activity Date] instead of 'Data'[Activity Type].
It should be
Investment Value =
VAR
maxDate = max('date 1'[Date 1])
VAR
currentInvestment = SELECTEDVALUE('Data'[Investment])
VAR
lastRevaluation = calculatetable ( TOPN( 1, 'Data', 'Data'[Activity Date] ),
REMOVEFILTERS(Data),
Data[Investment] = currentInvestment,
Data[Activity Type] = "Market Revaluation",
Data[Activity Date] <= maxDate
)
VAR
openingBalance = SELECTCOLUMNS(lastRevaluation, "@val", [Market Revaluation])
VAR
openingBalanceDate = SELECTCOLUMNS( lastRevaluation, "@val", [Activity Date])
VAR
totalPurchases = CALCULATE( sum(Data[Purchase Amount]),
REMOVEFILTERS('data'),
Data[Activity Type] = "Purchase",
Data[Investment] = currentInvestment,
Data[Activity Date] > openingBalanceDate && Data[Activity Date] <= maxDate
)
VAR
totalSales = CALCULATE( sum(Data[Sale Amount]),
REMOVEFILTERS('Data'),
Data[Activity Type] = "Sale",
Data[Investment] = currentInvestment,
Data[Activity Date] > openingBalanceDate && Data[Activity Date] <= maxDate
)
VAR
closingBalance = openingBalance + totalPurchases + totalSales
RETURN
closingBalance
Set up a date table but don't link it to the data table. Then try
Investment Value =
var maxDate = MAX('Date'[Date])
var currentInvestment = SELECTEDVALUE( 'Sheet1'[Investment] )
var lastRevaluation = CALCULATETABLE( TOPN(1, 'Sheet1', 'Sheet1'[Activity Date]),
REMOVEFILTERS('Sheet1'),
'Sheet1'[Investment] = currentInvestment,
'Sheet1'[Activity Type] = "Market Revaluation",
'Sheet1'[Activity Date] <= maxDate
)
var openingBalance = SELECTCOLUMNS( lastRevaluation, "@val", [Market Revaluation])
var openingBalanceDate = SELECTCOLUMNS( lastRevaluation, "@val", [Activity Date])
var totalPurchases = CALCULATE( SUM(Sheet1[Purchase Amount]),
REMOVEFILTERS( 'Sheet1'),
'Sheet1'[Activity Type] = "Purchase",
'Sheet1'[Investment] = currentInvestment,
'Sheet1'[Activity Date] > openingBalanceDate && 'Sheet1'[Activity Date] <= maxDate
)
var totalSales = CALCULATE( SUM(Sheet1[Sale Amount]),
REMOVEFILTERS( 'Sheet1'),
'Sheet1'[Activity Type] = "Sale",
'Sheet1'[Investment] = currentInvestment,
'Sheet1'[Activity Date] > openingBalanceDate && 'Sheet1'[Activity Date] <= maxDate
)
var closingBalance = openingBalance + totalPurchases + totalSales
return closingBalance
Thanks Johnt75, took me awhile to dissect what you are doing (I'm a beginner) but I see the logic now.
I'm getting an error when I plop [Investment Value] into any visual.
I think it's because the Investment field is a text field?
I've saved my attempt in this (2022.06.22 response to johnt) folder: https://drive.google.com/drive/folders/11WZKuWiNRz7vYAKmY0SP0gRwj8-qWJjo?usp=sharing
Also I've added in an independent date table as you suggested.
You have a typo at line 22, you're comparing 'Data'[Activity Date] instead of 'Data'[Activity Type].
It should be
Investment Value =
VAR
maxDate = max('date 1'[Date 1])
VAR
currentInvestment = SELECTEDVALUE('Data'[Investment])
VAR
lastRevaluation = calculatetable ( TOPN( 1, 'Data', 'Data'[Activity Date] ),
REMOVEFILTERS(Data),
Data[Investment] = currentInvestment,
Data[Activity Type] = "Market Revaluation",
Data[Activity Date] <= maxDate
)
VAR
openingBalance = SELECTCOLUMNS(lastRevaluation, "@val", [Market Revaluation])
VAR
openingBalanceDate = SELECTCOLUMNS( lastRevaluation, "@val", [Activity Date])
VAR
totalPurchases = CALCULATE( sum(Data[Purchase Amount]),
REMOVEFILTERS('data'),
Data[Activity Type] = "Purchase",
Data[Investment] = currentInvestment,
Data[Activity Date] > openingBalanceDate && Data[Activity Date] <= maxDate
)
VAR
totalSales = CALCULATE( sum(Data[Sale Amount]),
REMOVEFILTERS('Data'),
Data[Activity Type] = "Sale",
Data[Investment] = currentInvestment,
Data[Activity Date] > openingBalanceDate && Data[Activity Date] <= maxDate
)
VAR
closingBalance = openingBalance + totalPurchases + totalSales
RETURN
closingBalance
I cannot believe this is actually working 😲
Thank you! This helped more than you know.
March 31 - April 2, 2025, in Las Vegas, Nevada. Use code MSCUST for a $150 discount!
Arun Ulag shares exciting details about the Microsoft Fabric Conference 2025, which will be held in Las Vegas, NV.
User | Count |
---|---|
113 | |
80 | |
55 | |
54 | |
44 |
User | Count |
---|---|
168 | |
114 | |
74 | |
61 | |
53 |