Expand the data model
What we need now is a method not only to calculate, but to show the last month of the previous year when selecting a year, for example, 2025.
I have already solved this problem by adding a second date table and writing the corresponding measure.
You can find the full description of this solution and an explanation of how it works in the References section below.
The modified data model looks like this:

This new date table enables us to work with the item selected in the “Selection Date” table and perform calculations with the date table.
To support this, I set both tables as “Date table”. I can still use the “Date” table as usual without restrictions.
Developing the Measure(s)
The next step is writing the measures.
First, I must calculate the start value, which is the number of customers by the end of the (previous) year.
To achieve this goal, I must calculate the sum of all rows for the previous year, but for all months:
New Customers (YE) =
VAR SelYearPY = SELECTEDVALUE('Date'[Year])
VAR Result = CALCULATE([New Customers]
,REMOVEFILTERS('Date')
,'Date'[Year] = SelYearPY
)
RETURN
Result
The result is 280 for 2024.
You might wonder why I calculate the sum over the selected year instead of over the previous year.
The reason is that we want to show the result of this measure for December 2024 (When 2025 is selected). Please wait a moment until you see the results. These will help you understand it.
Now, we must develop a measure that returns the correct values depending on the month on the X-axis.
This should be the year-end value of the previous year for December 2024, or the count of new customers for each month of the current (selected) year. See the previous measure.
The measure we need must perform the following steps:
- Get the selected year from the date table.
- Calculate the first and last months to display in the report.
- Calculate the result by removing the filter from the date table used in the Slicer (The table “Selection Date”).
- Decide which result must be displayed for which month.
The last step is crucial.
As we remove the filter for the selected year from both the Date tables, we must control whether a result should be shown for each month. You will find this step in the SWITCH() part of the measure below.
This is the full measure:
Retail Sales Waterfall =
VAR SelYear = SELECTEDVALUE('Selection Date'[Year])
VAR MinYearMonth = SelYear * 100 + 1
VAR MaxYearMonth = SelYear * 100 + 12
VAR LastPYYearMonth = (SelYear - 1) * 100 + 12
VAR ActualMK = CALCULATE(
MAX('Date'[MonthKey])
,CROSSFILTER('Selection Date'[DateKey]
,'Date'[DateKey]
,None)
)
RETURN
SWITCH(TRUE()
,ActualMK = LastPYYearMonth
,CALCULATE([New Customers (YE)]
,CROSSFILTER('Selection Date'[DateKey]
,'Date'[DateKey]
,None)
,REMOVEFILTERS('Date')
,'Date'[MonthKey] = (SelYear - 1) * 100 + 12
)
,ActualMK >= MinYearMonth
&& ActualMK <= MaxYearMonth
,CALCULATE([New Customers]
,CROSSFILTER('Selection Date'[DateKey]
,'Date'[DateKey]
,None)
)
,BLANK()
)
This is the result:

Above the waterfall chart, you can see the numbers returned by the Measure.
As mentioned above, the year slicer in the top left corner doesn’t use the year column from the “Date” table, but from the “Selection Date” table. This is vital. The solution will not work when using the year column from the “Date” table.
Conclusion
The waterfall visual is excellent for showing the change in values from one element to another. An Element can be a month or something different. For example, you can find another article in the References section below, where I demonstrate how to modify a data model to display a business process with a waterfall visual in Power BI.
The solution shown here is a typical example of where I reused a previously developed approach to address a new challenge.
The beauty of this approach is that it allows me to continue using all Measures using the “regular” Date table without restriction and use the “Selection Date” table to add more functionality to the Report.
In this case, I added a feature to the waterfall chart that was previously unavailable.
I will not say that you always need two Date tables. Only add them when required. It makes no sense to add tables to a data model only for the sake of having them.
References
Here is my piece, where I show how I expanded my data model to be able to show more dates than selected:
Here, my piece where I explain how to change the data to show a business process with a waterfall chart:
Like in my previous articles, I use the Contoso sample dataset. You can download the ContosoRetailDW Dataset for free from Microsoft here.
The Contoso Data can be freely used under the MIT License, as described in this document. I changed the dataset to shift the data to contemporary dates.