Starting December 3, join live sessions with database experts and the Microsoft product team to learn just how easy it is to get started
Learn moreGet certified in Microsoft Fabric—for free! For a limited time, get a free DP-600 exam voucher to use by the end of 2024. Register now
Hi all,
Looking for some help to calculate a cumulative recurring total per sector.
Basically, i have the following data (with around 50 different IDs, and 12 differents sectors).
ID | Sector | Savings per year | Start Date | End date |
1 | HR | 32,353.13 $ | 2018-10-15 | 2019-10-15 |
2 | IT | 32,353.13 $ | 2018-12-15 | 2019-02-15 |
3 | HR | 662,291.67 $ | 2018-12-15 | 2019-03-15 |
4 | OP | 32,353.13 $ | 2018-12-15 | 2019-10-15 |
5 | IT | 841,500.00 $ | 2018-09-15 | 2019-10-15 |
I want to calculate the monthly saving (therefore, divings the savings per year by 12) and showing the monthly cumulative savings by sector.
For example:
- For Jan 2019, I want to have a total of all savings / 12 (As january 2019 is between the start date and end date). It would be broken down the following way: (HR (662K + 32K) + IT (32K + 841K)+OP(32K))/12 = Total saved for january 2019.
However, when I tried calculating it a new measure, I get the following chart:
This is the formula I have used to calculate the cumulative gain:
Total savings per month = CALCULATE( SUM(TableOperationnel[Savings per year]), FILTER( ALLSELECTED(TableOperationnel), TableOperationnel[Start Date] <= MAX(TableOperationnel[Start Date]) ) )
Has anyone faced a similar situation before? Any help would be appreciated!
Thanks 🙂
Ben
Solved! Go to Solution.
Hi,
Do you want something like this. You may download my file from here. I am accumulating savings from the start of the Year (January 1), rather than the start of the period for which data is available.
When I tried to use Dates from the 'Dates' table, it generates an error.
What was the error? Was it related to the bi-drectional relationship between the Dates and the Operational table? I'm not sure why you'd do that. Normally I'd have a 1 to many relationship from Dates to a fact/transaction table.
Any idea how to make it the reccuring saving appear for every month that is between [Start Date] and [End Date]?
You can't do a between join using relationships in a tabular model. But you can achieve the same effect by not having a join between your Date and Operational tables and doing the "between join" logic in a measure.
I used the following 2 measures to achieve the output above.
Amt = sumx( filter(sales, Sales[StartDate] < Max('Date'[Date]) && Sales[EndDate] > min('Date'[Date]) ) , Sales[Amount])
Cummulative Amt = CALCULATE( [Amt] , FILTER(ALL('date'), 'Date'[Date] <= max('Date'[Date])) )
You can download a copy of this model from here
Thank you very much to both of you for your help!
@Ashish_Mathur's solution ended working for me. @d_gosbell The difference between both of your solutions was that Ashish's was cumulative per month. My graph now looks like Ashish's graph in his previous response.
Thanks again to both of you 🙂
Ben
@Ashish_Mathur's solution ended working for me. @d_gosbell The difference between both of your solutions was that Ashish's was cumulative per month. My graph now looks like Ashish's graph in his previous response.
I think the main difference in our approaches is that I've done a "Lifetime to Date" while Ashish has done a "Year to Date" (so it resets on the first month of the year). Both are valid depending on the requirements
Hi,
Just reviewed both of your solutions more in details. Both actually hepled as I also used @d_gosbell to not keep a YTD limit.
I have also ended up using his formulas as the SUMX seemed to represent more the actual recurring savings per month.
Ashish's solution helped me set one line per month in between start date and end date.
Thanks and cheers,
Ben
That's great news @Anonymous thanks for letting us know. I think that shows the true power of forums like this - when you can pick up pointers from a couple of different responses and combine them into something that fits your requirements. 🙂
You are welcome.
Hi,
I do not understand. ID 3 is for a duration for 3 months only. Why should the number be divided by 12? Savings per month shoul d be number/3. Am i correct?
I think this issue is because you are using ALLSELECTED, so for the October column in your chart ALLSELECTED will only return October dates (as October is part of the current selection).
If you switch this to use the ALL(TableOperationnel[Start Date]) function it should fix your issue.
eg.
Total savings per month =
CALCULATE(
SUM(TableOperationnel[Savings per year]),
FILTER(
ALL(TableOperationnel[Start Date]),
TableOperationnel[Start Date] <= MAX(TableOperationnel[Start Date])
)
)
Hi d_gosbell,
Thanks a lot for your reponse! Your suggestion worked as it seems to show now in Power BI all the data I had in my data source (See screnshot below):
However, the reccuring saving appears only once instead of appearing for every month. For example, the saving that appears in novembre (which therefore, has a start date somewhere in novembre), does not appear for the subsequent month. It should also be divided by 12 to illustrated the average monthly saving.
How could I go from the current chart to one that:
- Divides the saving by 12
- Appears at every month between start date and end
- is grouped by sector
Do I have to create a new table? Is there a specific function/formula that can process this logic?
Thanks!
Ben
So normally I split all of my descriptive columns that I want to do grouping and filtering on into separate tables. So I'd have a table for dates that might have Date, Month, Quarter, Year, etc and a table for the sectors. I think the problem here is that each month is only doing the cumulative sum for sectors that have values in that month. Having the sectors in a separate table that is related to your main data table would avoid this issue.
However we can possibly also fix this by using ALL() over the sector column and if you want to divide this by 12 you should be able to add this at the end.
eg.
Total savings per month =
CALCULATE(
SUM(TableOperationnel[Savings per year]),
FILTER(
ALL(TableOperationnel[Start Date]),
TableOperationnel[Start Date] <= MAX(TableOperationnel[Start Date])
),
ALL(TableOperationnel[Sector])
) / 12
Hi to both of you 🙂
Sorry for the delay, I was trying to solve it myself. Followed Microsoft's training about DAX and did a lot of troubleshooting. Still not able to make it work.
@Ashish_Mathur : Eventhoguh ID 3 has a 3 month duration, the savings are an estimate per year. Therefore, the total savings for ID 3 would be (Savings for ID 3/12)*3.
@d_gosbell The main issue here is to illustrate the savings for every month per sector. Let me show what I think the logic should be for a specific example (Let's say Jan 2019, for HR sector).
1. Loop through each row (Use SUMX?) in the TableOperationnel.
IF ID's sector is equal to the HR sector
AND
IF [Start Date]< Jan 2019 < [End Date]
2. Divide savings of current ID by 12 AND add it to SUM of savings for JAN 2019 for HR sector
3. Go to the next sector
4. Go to next month
The logic above should be done For each month in the last 12 months (and 12 upcoming months), segmented by sectors.
You'll find the screenshot below of the chart when I tried the calculation you have suggested @d_gosbell :
I have also attached the relationship logi
Thanks again for your help folks!
Ben
Hi,
Do you want something like this. You may download my file from here. I am accumulating savings from the start of the Year (January 1), rather than the start of the period for which data is available.
Thanks @Ashish_Mathur
This chart is exactly what I am looking for. I created similar tables to "Calendar" and a "Month" table, similar to what you did.
However, when I looked into your "Data" table, I see that you had 1 date per month per sector. I didn't see any formula for the "Date" column. How did you create 12 lines (For all 12 months in a year) for every sector?
Was it through a formula?
Thanks again @Ashish_Mathur
Ben
H
You are welcome. Please click on the Query Editor and follow the steps show there. Also, if my reply helped, please mark it as Answer.
I think the issue with all months pulling the same value is possibly because you have a bi-directional relationship from dates and sectors back to the operational table. The dates should definitely be a one way, one to many relationship to the operations table. I think if you fix up the relationships the graph will fix itself.
And if you are always dividing by 12 the order of the operations should not matter. (1/12) + (3/12) + (5/12) is mathematically the same as (1 + 3 + 5) / 12 (the order is only important if you don't have a common denominator)
Thanks d_gosbell!
It definitely works better. I have also changed the 'Tableoperationnel' to 'secteur' to a "one to many" relationship, as one process can only be within one sector/division.
Is there a way I can make the savings recurring though? Currently, it seems like the savings are divided by 12, but they do not appear for every month.
Total savings = CALCULATE( SUM(TableOperationnel[annual saving per process]), FILTER( ALL('TableOperationnel'[Start Date]), TableOperationnel[Start Date] <= MAX(TableOperationnel[Start Date]) ), ALL('TableOperationnel'[Secteur]) ) / 12
When I tried to use Dates from the 'Dates' table, it generates an error.
Any idea how to make it the reccuring saving appear for every month that is between [Start Date] and [End Date]?
Thanks!
Ben
When I tried to use Dates from the 'Dates' table, it generates an error.
What was the error? Was it related to the bi-drectional relationship between the Dates and the Operational table? I'm not sure why you'd do that. Normally I'd have a 1 to many relationship from Dates to a fact/transaction table.
Any idea how to make it the reccuring saving appear for every month that is between [Start Date] and [End Date]?
You can't do a between join using relationships in a tabular model. But you can achieve the same effect by not having a join between your Date and Operational tables and doing the "between join" logic in a measure.
I used the following 2 measures to achieve the output above.
Amt = sumx( filter(sales, Sales[StartDate] < Max('Date'[Date]) && Sales[EndDate] > min('Date'[Date]) ) , Sales[Amount])
Cummulative Amt = CALCULATE( [Amt] , FILTER(ALL('date'), 'Date'[Date] <= max('Date'[Date])) )
You can download a copy of this model from here
Starting December 3, join live sessions with database experts and the Fabric product team to learn just how easy it is to get started.
March 31 - April 2, 2025, in Las Vegas, Nevada. Use code MSCUST for a $150 discount! Early Bird pricing ends December 9th.
User | Count |
---|---|
94 | |
84 | |
84 | |
73 | |
49 |
User | Count |
---|---|
143 | |
132 | |
110 | |
64 | |
55 |