Live training: next batches coming soon. Join the waitlist:Waitlists open:Developer Training →Developer →Copilot Studio Training →Copilot Studio →

Power BI Month Over Month Change: Build It Step by Step (DAX + Quick Measure)

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:

Power BI table with month, total sales, previous month sales, MoM change and MoM percent for 2026

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:

MonthSalesMonthSales
Jan 2026$14,472Jun 2026$22,979
Feb 2026$9,719Jul 2026$5,840
Mar 2026$32,329Aug 2026$38,199
Apr 2026$8,366Sep 2026$13,011
May 2026$20,786Total$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.

  1. Switch to Table view and select Modeling > New table.
  2. Paste the formula below and press Enter.
  3. Select the Date column. It came in as Date/time for me, so set Column tools > Data type to Date.
  4. 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")
)
Power BI Calendar table DAX with the Sort by column menu open and Month Number selected

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.

  1. Select the Calendar table in the Data pane.
  2. On Table tools, select Mark as date table.
  3. Turn the Mark as a date table toggle On.
  4. Pick Date under Choose a date column and select Save.
Mark as a date table dialog in Power BI with the toggle on and Date chosen as the date column

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.

  1. On the Modeling ribbon, select Manage relationships > New relationship.
  2. From table: Sales. Select the OrderDate column.
  3. To table: Calendar. Select the Date column.
  4. Confirm Cardinality is Many to one (*:1) and Cross-filter direction is Single, then select Save.
Power BI New relationship dialog linking Sales OrderDate to Calendar Date as many to one

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.

  1. Select the Sales table, then New measure on the Home ribbon.
  2. Enter the Total Sales formula below and set its format to Currency.
  3. 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]))
Prev Month Sales measure in the Power BI formula bar using CALCULATE and PREVIOUSMONTH

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.

  1. Create the MoM Change measure below (Currency).
  2. Create the MoM % measure (on Measure tools, click % and set 2 decimal places).
  3. 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])
Power BI table showing wrong month over month change values for January, October and the Total row

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
    )
Fixed MoM Change measure in Power BI using VAR and IF with NOT ISBLANK for both months

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:

MonthTotal SalesPrev Month SalesMoM ChangeMoM %
Feb 2026$9,719$14,472($4,753)-32.84%
Mar 2026$32,329$9,719$22,610232.64%
Apr 2026$8,366$32,329($23,963)-74.12%
May 2026$20,786$8,366$12,420148.46%
Jun 2026$22,979$20,786$2,19310.55%
Jul 2026$5,840$22,979($17,139)-74.59%
Aug 2026$38,199$5,840$32,359554.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.

  1. On the Home ribbon, select Quick measure.
  2. Under Select a calculation, scroll to Time intelligence and pick Month-over-month change.
  3. Drag Total Sales into Base value.
  4. Drag Calendar[Date] into Date, leave Number of periods at 1 and select Add.
Power BI Quick measure pane with Month-over-month change, Total Sales base value, Date field and 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)
DAX generated by the Power BI month over month quick measure using DATEADD minus one 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 %.

Power BI table comparing the custom MoM percent measure with the Total Sales MoM% quick measure

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

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.