I am working on a Power BI report and wasn't able to find a solution for my problem so far.
I want to calculate a so called Cancellation Rate for my company, meaning how many contracts were active at the beginning of a period (e.g. 01/01/2015) and how many of these contracts were cancelled in a certain period (e.g. from 01/01/2015 until 12/31/2015) and then calculating the percentage.
Therefore I am importing all contracts from the CRM into Power Bi. Every Contract has a Contract Start Date and a Contract End Date.
I used to calculate this in Excel with
=SUMIFS(Revenue; Contract Start Date < DateX; Contract End Date > DateX)
to calculate how many contracts were active on a certain DateX, e.g. 01/01/2015.
Do you have any recommendations on how I could solve this in Power BI?
My goal would be to have all the different periods in a chart on the axis and the according percentage as the value.
I would be so thankful if someone here could help me.
Based on my understanding, you can transfer the formula to DAX, which is used to create a measure.
active amount=CALCULATE(SUM(Table[Revenue]),Filter(Table, AND(Table[contract start data]<DateX[Date],Table[contract end data]>DateX[Date])))
Then create a measure to calculate the amount of concelled contracts.
concelled amount=CALCULATE(SUM(Table[Revenue]),Filter(Table, Table[contract end data]>=DateX[Date1],Table[contract end data]<=DateX[Date2])))
Then calculate the percentage.
percentage=[active amount]/[concelled amount]
Then you can create a line chart, then select the Datex[Date] as axis, the [percentage] as value level, you will get expected result.
If this is not want you want, please post the sample data as @Phil_Seamark suggested.
I posted some sample data minutes ago.
I already tried it like in your suggestion, but as the coloumns Dates['Period Dates'] and Contracts['Contract Start Date'] are in different tables, I can't refere to both in one measure unfortunately, but I can do so in an extra column. I don't know why this is the case or what I am doing wrong here.
This is the column I have:
Do you know why this doesn't work as a measure?
In the analysis part I then want to split this rate up into different contract types, regions, etc. As long as the rate is just an extra column it is not working unfortunately.
here is some sample data for you. Thank you so much already. I really appreciate it.
|Customer||Contract Type||Total Price||Contract Start Date||Contract End Date||Address 1: Country (Customer)|
|Customer 1||Update Contract||1.687,44||8.1.2005||7.31.2017||Austria|
|Customer 2||Update Contract||2.595,00||6.1.2003||5.31.2017||United States|
|Customer 3||Support Contract||6.923,04||3.1.2016||9.30.2020||Germany|
|Customer 4||Update Contract||1.119,96||11.1.2006||10.31.2017||Germany|
|Customer 5||Support Contract||4.560,00||7.30.2010||8.31.2014||United States|
|Customer 6||Cloud Agreement||1.932,00||10.1.2015||9.30.2016||Spain|
|Customer 7||Support Contract||7.856,28||4.1.2015||3.31.2018||United Kingdom|
|Customer 8||Update Contract||798,72||1.1.2001||12.31.2005||Switzerland|
|Customer 9||Cloud Agreement||1.890,00||12.1.2016||11.30.2017||United States|
|Customer 10||Update Contract||309,00||1.1.2011||12.31.2014||Isle Of Man|
|Customer 11||Cloud Agreement||343,00||8.15.2014||3.31.2017||Germany|
|Customer 12||Update Contract||6.319,44||5.1.2002||4.30.2017||Germany|
|Customer 13||Update Contract||4.535,16||10.1.2006||9.30.2017||Germany|
|Customer 14||Cloud Agreement||4.116,00||10.1.2015||9.30.2017||Germany|
|Customer 15||Support Contract||6.996,00||7.7.2011||8.31.2017||United States|
|Customer 16||Support Contract||193,80||1.1.2011||12.31.2017||Switzerland|
|Customer 17||Update Contract||232,92||8.1.2011||7.31.2017||Germany|
|Customer 18||Support Contract||329,76||2.1.2008||1.31.2018||Germany|
|Customer 19||Support Contract||1.644,00||9.1.2007||8.31.2008||United States|
|Customer 20||Support Contract||312,00||7.17.2009||7.31.2016||United States|
|Customer 21||Support Contract||2.814,00||11.26.2014||11.30.2016||Mexico|
|Customer 22||Support Contract||744,00||3.16.2011||3.31.2012||Mexico|
|Customer 23||Update Contract||1.610,64||5.1.2002||4.30.2013||Germany|
|Customer 24||Update Contract||1.545,24||12.1.2011||11.30.2017||Germany|
|Customer 25||Update Contract||5.355,00||7.30.2010||8.31.2017||United States|
|Customer 26||Support Contract||200,00||2.18.1998||2.18.2002||United States|
|Customer 27||Update Contract||1.771,20||3.1.2005||12.31.2017||Germany|
|Customer 28||Support Contract||4.902,00||12.31.2008||10.31.2017||United States|
|Customer 29||Update Contract||1.279,56||6.1.2015||12.31.2017||Austria|
|Customer 30||Support Contract||312,00||9.30.2008||9.30.2014||United States|
|Customer 31||Support Contract||2.719,80||1.1.1980||2.28.2018||United States|
|Customer 32||Support Contract||4.999,92||12.10.2003||12.31.2017||United States|
|Customer 33||Support Contract||312,00||6.24.2013||6.30.2014||United States|
|Customer 34||Support Contract||32.325,00||9.1.2015||8.31.2020||United States|
|Customer 35||Cloud Agreement||4.116,00||6.1.2016||5.31.2017||Germany|
|Customer 36||Support Contract||8.397,00||10.19.2011||6.30.2017||Brazil|
|Customer 37||Update Contract||1.437,84||5.1.2015||4.30.2017||Switzerland|
|Customer 38||Update Contract||6.624,24||9.1.2007||8.31.2017||Germany|
|Customer 39||Support Contract||3.153,12||11.1.2010||12.31.2017||Germany|
There are a few moving parts to this one so rather than type it up, here is a PBIX file for you to have a play with
I think it is close, but once we have applied any tweaks, we can post more detail in here for future searches.
Feel free to ask any questions you have 🙂
it took me a while to try to apply this format to the whole data set from our company.
Your solution looks really good, it is definitely going in the right direction. Thank you so much for your help already!
I only do not understand, how you created this "Processed Data" Table.
I can see that you typed in the following formula there, but I don't know where to type this formula in, when I create a new Power BI sheet with the whole data from the company. Did you do "Merge Queries" or did you start the new table with "Enter new Data"? Or is there a completely different way you did this? Once I know how to create this Processed Data Tab, I think it should be working.
Processed Data = ADDCOLUMNS(
-- Started before start of Quarter and was active during the quarter
[Contract Start Date]<=[QuarterStart] &&
[Contract End Date] > [QuarterStart]
-- Started During the Quarter
[Contract Start Date]<=[QuarterEnd] &&
[Contract Start Date]>=[QuarterStart]
"Contracts Started" ; if([Contract Start Date]<[QuarterEnd] && [Contract Start Date]>=[QuarterStart];1;0);
"Contracts Ended" ; if([Contract End Date]<[QuarterEnd] && [Contract End Date]>=[QuarterStart];1;0)
I am really looking forward hearing from you.
Yes, here I have some sample data:
So this is my model with the realtionships:
Account = All the Customers with its information regarding the customer's adress, country, etc.
Contract = All Contracts with information like Contract Start Date, Contract End Date, etc (matched to Account with the Customer ID)
Subterritories = More detailled analysis for regions, so I match a subterritory (like UK) from the Customer's account to the firm of the company, Regions, etc. (not really important for the problem here)
Exchange Rate = As we have contracts in many countries, I am matching the currency from contract to Exchange rate (also not really important for this problem)
Dates = I don't know if this is necessary. It is a date table, with dates in it. As I want to measure the different things (Active Revenue, Cancelled Revenue) on a quarterly period, so I have all the dates of the start of a quarter period there, e.g. 01/01/2015, 04/01/2015, 07/01/2015 and so on. Then I am referring to this date when I am calculating how much revenue was valid at a certain date. Also the same with expired contracts. So far everything clear?
So at the moment, I am calculating the revenue that is valid like this:
=CALCULATE(SUM(Revenue); FILTER(Contracts, Contract Start Date < Dates.QuarterBeginnDate); FILTER(Contracts, Contract End Date > Dates.QuarterBeginnDate)
It is an extra column, because when I try to calculate is as a measure, the 'Dates.QuarterBeginnDate' is not possible to select in the formula from above. I don't know the reason.
Same for the expired contracts:
=CALCULATE(SUM(Revenue);FILTER(Contracts, Contract Start Date < Dates.QuarterBeginnDate); FILTER(Contract End Date > Dates.QuarterBeginnDate); FILTER(Contract End Date > Dates.Period End Date)
Like this, I am calculating a percentage. Also here, it is again not possible to create a measure, because these column names do not appear when I try to enter it in the formula. So I created an extra column again.
What I would love to have is something like this:
So to calculate a rate for every period. This is how I did it in Excel and then I graph it in a chart.
What I want in Power BI is basically the same, to calculate this (only for help) and then graph the rates in a chart. What I want is that with Slicer in Power BI I can easily re calculate the rates for different contract types, for different countries, for different Sales Partner. I don't know in this case if Power BI with its time intelligence is intelligent enough to aleady calculate the rates for periods itself or if I need these date tables or maybe something different.
Do you have any idea of how I could do that?
Thank you and Regards,
This is a must watch for a message from Power BI!
Click here to read more about the December 2020 Updates!
Click here to read the latest blog and learn more about contributing to the Power BI blog!
Mark your calendars and join us for our next Power BI Dev Camp!.