Check your eligibility for this 50% exam voucher offer and join us for free live learning sessions to get prepared for Exam DP-700.
Get StartedDon't miss out! 2025 Microsoft Fabric Community Conference, March 31 - April 2, Las Vegas, Nevada. Use code MSCUST for a $150 discount. Prices go up February 11th. Register now.
Dear community,
Main issue; finding the most compute effective approach.
Current Datamodel;
Background info;
Task;
My first approach;
#"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each Table.Max(Table.SelectRows(Rates, (Rate) => Rate[Date]<=[Date] and Rate[Currency]=[Currency]),"Date")
),
#"Expanded Custom" = Table.ExpandRecordColumn(#"Added Custom", "Custom", {"Rate"}, {"Rate"})
Second approach;
Sales Revenue =
SUMX(
'Sales Revenue and Cost',
'Sales Revenue and Cost'[Line Amount] *
Calculate(
min('Exchange Rates'[Rate]),
filter('Exchange Rates',
'Exchange Rates'[From Currency]='Sales Revenue and Cost'[Company Currency] &&
'Exchange Rates'[Date]<='Sales Revenue and Cost'[Date] &&
'Exchange Rates'[To Currency]=SELECTEDVALUE('Reporting Currency'[Currency])
)
)
)
Third approach, and where I am stuck:
Sales Revenue = SUMX( VALUES('Sales Revenue and Cost'[Currency]), [Sales Revenue LCY] * [Sales Revenue Reporting Currency Rate] ) Sales Revenue LCY = SUM('Sales Revenue and Cost'[Line Amount]) Sales Revenue Reporting Currency Rate = Calculate( min('Exchange Rates'[Rate]), filter('Exchange Rates', 'Exchange Rates'[From Currency]=MAX('Sales Revenue and Cost'[Currency]) && 'Exchange Rates'[Date]<=MAX('Sales Revenue and Cost'[Date]) && 'Exchange Rates'[To Currency]=SELECTEDVALUE('Reporting Currency'[Currency]) ) )
I am stuck, quite beginners level and have spent so many hours to the point of much frustration - any hint of the right direction would be greatly appreciated!
Best regards,
Lasse
I continued a bit on my own.
Current trial;
Sales Revenue =
VAR ExchangeRate = Calculate(
min('Exchange Rates'[Rate]),
filter('Exchange Rates',
'Exchange Rates'[From Currency]=MIN('Sales Revenue and Cost'[Currency]) &&
'Exchange Rates'[Date]<=MAX('Sales Revenue and Cost'[Date]) &&
'Exchange Rates'[To Currency]=SELECTEDVALUE('Reporting Currency'[Currency])
)
)
RETURN
SUMX(
SUMMARIZE('Sales Revenue and Cost','Sales Revenue and Cost'[Currency]),
[Sales Revenue LCY] * ExchangeRate
)
With [Sales Revenue LCY] being;
Sales Revenue LCY = SUM('Sales Revenue and Cost'[Line Amount])
It seems to perform better compute and memorize-wise, and a visual with Year-Month calculates correct Reporting Currency Amount but totals the columns incorrectly with total sum of LCY times "Last Exchange Rate"...
And I still have my doubts if this is best practice at all 😞
Hi @LasseL ,
Based on your description, the current trial will have a better performance beacuse it uses variable and summazire a table in the sumx() function.
"but totals the columns incorrectly with total sum of LCY times "Last Exchange Rate""
What is your expected output? Could you please consider sharing more details like sample file, screenshots etc. about this issue for further discussion?
Sample data and expected output would help tremendously.
Please see this post regarding How to Get Your Question Answered Quickly:
https://community.powerbi.com/t5/Community-Blog/How-to-Get-Your-Question-Answered-Quickly/ba-p/38490
Best Regards,
Yingjie Li
Dear Yingjie,
Thank you so much for getting back.
For confidential reasons I can't share the actual PBIX and data that I am working in, but I tried to reproduce a demo dataset (excel) and a PBIX fil with similar setup.
Attached;
What I would expect is the totals of Sales to be correct with latest exchange rate when choosing either DKK or EUR as a reporting currency;
Does this help?
Hi @LasseL ,
Seems like I could not download the sample due to the access. Perhaps you can modify the visit access and consider re-sharing the sample file.
Best Regards,
Yingjie Li
Hi again Yingjie,
My sincere appologies, I will try another means; https://we.tl/t-264shFE8H6
Does this work?
Best regards,
Lasse
Hi @LasseL ,
So your expected result is like this?
If so, try to modify like this:
Sales Revenue =
VAR ExchangeRate =
CALCULATE (
MIN ( Rates[Rate] ),
FILTER (
Rates,
Rates[From Currency] = MIN ( Orders[Currency] )
&& Rates[Date] <= MAX ( Orders[Date] )
&& Rates[To Currency] IN DISTINCT ( 'ReportingCur'[Currency] )
)
)
RETURN
SUMX (
SUMMARIZE ( Orders, Orders[Currency] ),
[Sales Revenue LCY] * ExchangeRate
)
Best Regards,
Yingjie Li
If this post helps then please consider Accept it as the solution to help the other members find it more quickly.
Wow, what a quick response, and what a small correct with big impact!
Thank you so much, helped a lot.
I still see some issues though;
1) It seems it is not consistent in picking the last valid exchange rate from "before" the order date, sometimes yes, a few times it jumps?
2) and more important, if I change reporting currency from EUR to DKK i get some strange summarizations;
Any ideas on why, what did the IN DISTINCT exactly do 🙂
Hi @LasseL ,
I find that you have disabled the interactions between the slicer and the two tables under the sample file so the value looks like 'strange', just resume the interaction and the value shoule be normal.
About IN statement, it creates a logical OR condition between each row being compared to a table and the Distinct statement removes dupulicate values and only return unique values.
You can refer these articles if you are interested about them:
Attached the modified sample file in the below, hopes to help you.
Best Regards,
Yingjie Li
If this post helps then please consider Accept it as the solution to help the other members find it more quickly.
Thanks a lot for filter-correction, the explanation and definition!
How come the sum of sales value does not reflect the actual sum of each line, in this case DKK sum should be ~14+311 = ~325DKK
Hi @LasseL ,
I re-write the measure like this:
Sales Revenue =
VAR tab =
SUMMARIZE (
'Orders',
'Calendar'[Date],
'Orders'[Currency],
'Orders'[Price],
"REp",
CALCULATE (
MIN ( Rates[Rate] ),
FILTER (
Rates,
Rates[From Currency] IN DISTINCT ( Rates[From Currency] )
&& 'Rates'[To Currency] IN DISTINCT ( ReportingCur[Currency] )
)
)
)
RETURN
SUMX ( tab, [REp] * [Price] )
Now the sum value should be correct:
See the sample file in the below, hopes to help you.
Best Regards,
Yingjie Li
If this post helps then please consider Accept it as the solution to help the other members find it more quickly.
Hi again @v-yingjl ,
On the positive side, yes, now it gives an (almost) perfect calculation (missing the original correct look up of the exchange rate closest (before) to the transaction date - but I can fix that.
On the negative side, then I believe we are back to the poor performance of the original solution of a line by line calculation (SUMX) which was the approach that proved ineffective from the beginning when working on the big dataset, i.e. original measure was;
Sales Revenue =
SUMX(
'Sales Revenue and Cost',
'Sales Revenue and Cost'[Line Amount] *
Calculate(
min('Exchange Rates'[Rate]),
filter('Exchange Rates',
'Exchange Rates'[From Currency]='Sales Revenue and Cost'[Company Currency] &&
'Exchange Rates'[Date]<='Sales Revenue and Cost'[Date] &&
'Exchange Rates'[To Currency]=SELECTEDVALUE('Reporting Currency'[Currency])
)
)
)
I just tested your measure against the big dataset, and the performance is dreadfully slow and I hit again memory errors from the MS datacenter.
However, I feel you are on to "something", is there a way we can get around the line by line calculation for each transaction and aggregate to a higher level, e.g. grouped by Calendar[Year-Month] and Orders[Currency]; thinking next evolution of your last measure to something like;
Sales Revenue =
VAR tab =
SUMMARIZE (
'Orders',
'Calendar'[Year-Month],
'Orders'[Currency],
'Orders'[Price],
"REp",
CALCULATE (
MIN ( Rates[Rate] ),
FILTER (
Rates,
Rates[From Currency] IN DISTINCT ( Rates[From Currency] )
&& 'Rates'[To Currency] IN DISTINCT ( ReportingCur[Currency] )
&& 'Rates'[Date] <= MAX(Orders[Date])
&& MAX('Rates'[Date])
)
)
)
RETURN
SUMX ( tab, [REp] * [Price] )
Still, can't hit the correct exchange rate and sum of converted price is still not right - but at least it seems to run faster as the sumx is performed on a higher aggregated level?
March 31 - April 2, 2025, in Las Vegas, Nevada. Use code MSCUST for a $150 discount!
Check out the January 2025 Power BI update to learn about new features in Reporting, Modeling, and Data Connectivity.
User | Count |
---|---|
121 | |
79 | |
47 | |
45 | |
36 |
User | Count |
---|---|
179 | |
89 | |
69 | |
47 | |
47 |