Our sales lead wanted one table for the monthly review: each month’s sales, last month’s sales, the dollar change and the percent change. And no fake jump in January or -100% drop in a month that hasn’t started.
In this tutorial, we’ll build that Power BI month over month change report from a 60-order sales file. We’ll add a date table, a previous month measure, the MoM change and MoM % measures, and then compare the result with Power BI’s built-in quick measure.
Here’s what we’re building:

March 2026 grew $22,610 (232.64%) over February, and July fell $17,139 (-74.59%). January, October and the Total row stay blank, because there’s nothing honest to compare. The report has four parts:
- A Calendar table, marked as the model’s date table.
- A Prev Month Sales measure built with PREVIOUSMONTH.
- MoM Change and MoM % measures that skip months without two values.
- A Total Sales MoM% quick measure, to see what Power BI writes for you.
Before You Start
You only need Power BI Desktop, which is free. Nothing here needs a Pro license until you publish. If you’re new to the tool, our Power BI tutorials cover the basics first.
My demo file is SPGuides_Sales_2026.csv: 60 orders from January to September 2026 with OrderID, OrderDate, Region, City, State, ZIP, Category, Product, SalesRep, Quantity and Sales. It loads as a table called Sales; only OrderDate and Sales matter here.
Here are the monthly totals, so you can recreate the file or check your own numbers:
| Month | Sales | Month | Sales |
|---|---|---|---|
| Jan 2026 | $14,472 | Jun 2026 | $22,979 |
| Feb 2026 | $9,719 | Jul 2026 | $5,840 |
| Mar 2026 | $32,329 | Aug 2026 | $38,199 |
| Apr 2026 | $8,366 | Sep 2026 | $13,011 |
| May 2026 | $20,786 | Total | $165,701 |
There are no orders from October to December yet. That gap is on purpose: it breaks most month over month formulas.
Step 1: Create a Calendar Table
PREVIOUSMONTH needs a date column with no gaps. Order dates have gaps (no orders on some days), so we build a Calendar table.
- Switch to Table view and select Modeling > New table.
- Paste the formula below and press Enter.
- Select the Date column. It came in as Date/time for me, so set Column tools > Data type to Date.
- Select the Month column, then Column tools > Sort by column > Month Number.
Calendar =
ADDCOLUMNS(
CALENDAR(DATE(2026, 1, 1), DATE(2026, 12, 31)),
"Year", YEAR([Date]),
"Month Number", MONTH([Date]),
"Month", FORMAT([Date], "mmm yyyy")
)

CALENDAR returns one column named Date with every day from January 1 to December 31, 2026. ADDCOLUMNS adds Year, Month Number and a text Month like Jan 2026. Our Power BI DAX CALENDAR function guide covers more column ideas.
The sort step matters: Month is text, so it would otherwise sort alphabetically (Apr before Jan).
Checkpoint: The Calendar table has 365 rows, and Jan 2026 is the first value in the Month column.
Step 2: Mark It as a Date Table
Marking the table tells Power BI which column to use for date logic. Microsoft’s docs say you must do this when you use the classic time intelligence functions, which PREVIOUSMONTH and DATEADD are.
- Select the Calendar table in the Data pane.
- On Table tools, select Mark as date table.
- Turn the Mark as a date table toggle On.
- Pick Date under Choose a date column and select Save.

Power BI checks the column first: unique values, no blanks and contiguous dates. CALENDAR passes all three.
Checkpoint: Validated successfully appears under the Date drop-down, and Save is enabled.
Note: marking removes the auto date hierarchy. For Year > Month drill-down, build one from the Calendar columns, as in our date hierarchy in Power BI post.
Step 3: Relate Sales to the Calendar
The Calendar only filters Sales once the two are related on the date.
- On the Modeling ribbon, select Manage relationships > New relationship.
- From table: Sales. Select the OrderDate column.
- To table: Calendar. Select the Date column.
- Confirm Cardinality is Many to one (*:1) and Cross-filter direction is Single, then select Save.

Power BI didn’t pick the columns for me, because the names differ (OrderDate vs Date). Click both column headers yourself.
Checkpoint: In Model view, a line runs from Sales[OrderDate] (*) to Calendar[Date] (1).
Step 4: Create the Prev Month Sales Measure
Everything starts from one base measure; skip it if you already have Total Sales. Measures, not calculated columns, are the right tool here; our post on the difference between a calculated column and a measure explains why.
- Select the Sales table, then New measure on the Home ribbon.
- Enter the Total Sales formula below and set its format to Currency.
- Choose New measure again and enter Prev Month Sales, also as Currency.
Total Sales = SUM(Sales[Sales])
Prev Month Sales =
CALCULATE([Total Sales], PREVIOUSMONTH('Calendar'[Date]))

PREVIOUSMONTH looks at the first date in the current filter, then returns every date of the month before it. On the Mar 2026 row, that’s February 1 to 28, so CALCULATE gives February’s $9,719.
Checkpoint: On the Feb 2026 row, Prev Month Sales shows $14,472, which is January’s total.
For just this month and last month as two cards, see our guide to current month and previous month sales in Power BI.
Step 5: Add MoM Change and MoM % to a Table
Now the two formulas people search for. The change is a plain subtraction of two measures (more on that in subtracting measures in Power BI), and the percent divides that change by the previous month.
- Create the MoM Change measure below (Currency).
- Create the MoM % measure (on Measure tools, click % and set 2 decimal places).
- Add a Table visual with Calendar[Month], Total Sales, Prev Month Sales, MoM Change and MoM %, in that order.
MoM Change = [Total Sales] - [Prev Month Sales]
MoM % = DIVIDE([MoM Change], [Prev Month Sales])

February to September look right. February dropped $4,753 (-32.84%) and August jumped $32,359 (554.09%) over July. Three rows are wrong, though:
- Jan 2026 shows a $14,472 change. There’s no earlier month in the data, so the formula subtracts blank and calls the whole month growth.
- Oct 2026 shows ($13,011) and -100.00%. The Calendar runs to December, so October appears with September’s sales as its previous month.
- Total shows a $165,701 change, which means nothing for a whole year.
DIVIDE keeps January’s MoM % blank (it returns BLANK for a blank denominator), but the dollar change has no such guard.
Checkpoint: Your table matches the screenshot, including the three wrong rows. We fix them next.
Step 6: Fix January, Empty Months and the Total Row
The rule we want is simple: only show a change when both months have sales. Open the MoM Change measure and replace its formula.
MoM Change =
VAR CurrentSales = [Total Sales]
VAR PrevSales = [Prev Month Sales]
RETURN
IF(
NOT ISBLANK(CurrentSales) && NOT ISBLANK(PrevSales),
CurrentSales - PrevSales
)

IF without a third argument returns BLANK when the test fails. For the difference between ISBLANK vs ISEMPTY in Power BI DAX, see our comparison.
MoM % divides MoM Change, so it goes blank on the same rows without any edit.
Checkpoint: January, October and the Total row show blank MoM Change and MoM % cells, and February to September are unchanged.
Test the Month Over Month Measures
Check the finished table at the top against a calculator. MoM % is the change divided by the previous month:
| Month | Total Sales | Prev Month Sales | MoM Change | MoM % |
|---|---|---|---|---|
| Feb 2026 | $9,719 | $14,472 | ($4,753) | -32.84% |
| Mar 2026 | $32,329 | $9,719 | $22,610 | 232.64% |
| Apr 2026 | $8,366 | $32,329 | ($23,963) | -74.12% |
| May 2026 | $20,786 | $8,366 | $12,420 | 148.46% |
| Jun 2026 | $22,979 | $20,786 | $2,193 | 10.55% |
| Jul 2026 | $5,840 | $22,979 | ($17,139) | -74.59% |
| Aug 2026 | $38,199 | $5,840 | $32,359 | 554.09% |
| Sep 2026 | $13,011 | $38,199 | ($25,188) | -65.94% |
For March: 32,329 – 9,719 = 22,610, and 22,610 / 9,719 = 2.3264, or 232.64%.
October still shows $13,011 under Prev Month Sales. That’s correct; only the comparison is hidden. To see each month’s share of the year instead of the change, try Power BI percentage of total by month.
Same Thing With the Month-over-Month Change Quick Measure
Power BI can also write the MoM % formula for you on the same Sales table and Calendar.
- On the Home ribbon, select Quick measure.
- Under Select a calculation, scroll to Time intelligence and pick Month-over-month change.
- Drag Total Sales into Base value.
- Drag Calendar[Date] into Date, leave Number of periods at 1 and select Add.

Power BI adds a measure called Total Sales MoM% with the Percentage format. Select it and the formula bar shows the DAX it wrote:
Total Sales MoM% =
VAR __PREV_MONTH = CALCULATE([Total Sales], DATEADD('Calendar'[Date], -1, MONTH))
RETURN
DIVIDE([Total Sales] - __PREV_MONTH, __PREV_MONTH)

It uses DATEADD(‘Calendar'[Date], -1, MONTH) instead of PREVIOUSMONTH. On a single month row the two return the same dates, which is why every number from February to September matches our MoM %.

The edge rows differ: the quick measure shows -100.00% for October and 0.00% on Total.
Why 0.00%? On the Total row, DATEADD shifts all of 2026 back a month. DATEADD only keeps dates that exist in the Calendar, so that’s January 1 to November 30, which holds all $165,701 of sales. Same value twice, zero change.
I start with the quick measure, then add the ISBLANK check from Step 6 to its formula.
Show the Change in a Card or Chart
Measures work in any visual, not just the table. For a headline, add MoM % to a card visual in Power BI and filter the page to Sep 2026; it shows the same -65.94% as the table row.
For a trend, put Calendar[Month] on the X-axis of a line chart in Power BI with Total Sales, and add MoM % to the tooltips. To color the MoM % cells red and green, follow our guide to conditional formatting based on a measure.
Troubleshooting
- Prev Month Sales is blank on every row: the table uses Sales[OrderDate] or a text month from Sales. Use Calendar[Month] and check the relationship from Step 3.
- Months sort Apr, Aug, Dec: the Month column isn’t sorted by Month Number (Step 1).
- The first month shows a huge change: that’s the blank previous month. Use the ISBLANK version of MoM Change.
- DATEADD returns an error: the dates in context aren’t contiguous. Point it at the marked Calendar[Date], not at the order date column.
Important: time intelligence quick measures aren’t available in DirectQuery mode, so write the measure yourself there. If a filter still seems ignored, our post on Power BI DAX date filter not working covers the usual causes.
Where to Take It Next
- Add a Year slicer from the Calendar and switch the logic to year over year with SAMEPERIODLASTYEAR or DATEADD(…, -1, YEAR). Our Power BI date slicer examples help with the slicer.
- Compare each month with the company total using percentage of total by category techniques on the same Sales table.
- Keep the change correct under page filters by learning how to remove filters in Power BI DAX with ALL and ALLSELECTED.
These guides build on the same sales model and measures:
Frequently Asked Questions
What is the month over month change formula?
It’s this month minus last month; the percent version is (current – previous) / previous. In DAX: [Total Sales] – [Prev Month Sales] and DIVIDE([MoM Change], [Prev Month Sales]).
How do I calculate month over month change in Power BI?
Create a Calendar table, mark it as a date table and relate it to your sales dates. Then build Prev Month Sales with CALCULATE and PREVIOUSMONTH, subtract it from Total Sales, and divide with DIVIDE. The PREVIOUSMONTH function reference explains which dates it returns.
How do I do a month on month comparison in Power BI without a date table?
You can use the built-in date hierarchy on the order date, but a marked date table is more reliable: order dates have gaps, and DATEADD errors on non-contiguous dates.
How do I use the month over month change quick measure?
Select Quick measure, pick Month-over-month change under Time intelligence, put your measure in Base value and your date column in Date, then select Add. See quick measures on Microsoft Learn for the full list and the DirectQuery limit.
Why does my month over month percentage show -100%?
A month with no sales yet still has a previous month, so the change is the whole previous amount. Return BLANK unless both months have values, using IF with NOT ISBLANK on both.

Hey! I’m Bijay Kumar, founder of SPGuides.com and a Microsoft Business Applications MVP (Power Automate, Power Apps). I launched this site in 2020 because I truly enjoy working with SharePoint, Power Platform, and SharePoint Framework (SPFx), and wanted to share that passion through step-by-step tutorials, guides, and training videos. My mission is to help you learn these technologies so you can utilize SharePoint, enhance productivity, and potentially build business solutions along the way.