How did each product grow from last month to this month?
By the Analistable team · Updated · 3 min read
Join the two monthly files on product, then calculate change = this month − last month and growth % = change ÷ last month. Use a full outer join (or check both directions) so products that are new this month, or that sold nothing this month, still appear. In the example, total revenue grew from 11,740 to 12,440 (+6.0%), but Desks fell 25%.
Part of our guide: How to answer questions across multiple spreadsheets
The data
| Product | Jan revenue | Feb revenue |
|---|---|---|
| Desk | 5040 | 3780 |
| Chair | 5400 | 6480 |
| Lamp | 1300 | 1430 |
| Shelf | — | 750 |
In a spreadsheet
Jan =XLOOKUP([@Product], Jan[Product], Jan[Revenue], 0)
Change =[@Feb] - [@Jan]
Growth % =IF([@Jan] = 0, "new", [@Change] / [@Jan])Build the product list from both months so nothing is missed: =UNIQUE(VSTACK(Jan[Product], Feb[Product])).
In SQL
SELECT COALESCE(f.product, j.product) AS product,
j.revenue AS jan, f.revenue AS feb,
COALESCE(f.revenue, 0) - COALESCE(j.revenue, 0) AS change,
ROUND(100.0 * (f.revenue - j.revenue) / j.revenue, 1) AS growth_pct
FROM feb f
FULL OUTER JOIN jan j ON j.product = f.product;| product | jan | feb | change | growth_pct |
|---|---|---|---|---|
| Desk | 5040 | 3780 | -1260 | -25.0 |
| Chair | 5400 | 6480 | 1080 | 20.0 |
| Lamp | 1300 | 1430 | 130 | 10.0 |
| Shelf | NULL | 750 | 750 | NULL (new) |
Reading growth correctly
- Total growth: (12,440 − 11,740) ÷ 11,740 = 6.0%. Shelf, a new product, contributes 750 of the 700 increase — without it, existing products shrank.
- Months have different lengths and numbers of weekends; compare daily averages or the same month last year when seasonality matters.
- For year-over-year, the same join works on product and month across two years' files.
Ask it in Analistable: “Compare revenue by product between January and February, including new products.”
In Google Sheets
=ARRAYFORMULA(IF(A2:A = "", ,
IFERROR(VLOOKUP(A2:A, Feb!A2:C, 3, FALSE), 0) / IFERROR(VLOOKUP(A2:A, Jan!A2:C, 3, FALSE), 0) - 1))With the product list in column A, this returns growth as a fraction (format as %). Products new in February divide by zero and return an error — wrap the division in IFERROR(…, "new") to label them.
Where the growth came from
| Product | Change | Contribution (change ÷ Jan total 11,740) |
|---|---|---|
| Desk | -1260 | −10.7 pts |
| Chair | 1080 | +9.2 pts |
| Lamp | 130 | +1.1 pts |
| Shelf (new) | 750 | +6.4 pts |
| Total | 700 | +6.0% |
Contributions add up to the total growth, which makes them easier to present than individual growth percentages: Lamp grew 10% but added barely one point, while Desk's 25% fall took almost eleven points off.
Adjusting for month length
January 2026 has 31 days and February 28. Daily averages are 11,740 ÷ 31 = 378.7 and 12,440 ÷ 28 = 444.3, so daily revenue grew 17.3%, far more than the headline 6.0%. Use daily averages when months differ in length or trading days; use raw totals when you are tracking against a monthly budget.
Excel 2019 and older
Jan =IFERROR(INDEX(Jan!B:B, MATCH(A2, Jan!A:A, 0)), 0)
Feb =IFERROR(INDEX(Feb!B:B, MATCH(A2, Feb!A:A, 0)), 0)
Growth % =IF(B2 = 0, "new", (C2 - B2) / B2)Without VSTACK and UNIQUE, build the product list by pasting both months' products into column A and using Data › Remove Duplicates.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| Product shows −100% | Renamed or recoded between months | Map old and new codes before joining |
| Totals don't match the files | Product list built from one month only | Build it from both months |
| #DIV/0! errors | Product new this month | Label as “new” instead of dividing |
To repeat this every month, stack all months in one table with a Month column and pivot products by month; the change columns then extend automatically. More on joining files like this: comparing spreadsheets.
Frequently asked questions
- How do I calculate month-over-month growth in Excel?
- Put both months' values side by side with XLOOKUP, then growth = (this month − last month) ÷ last month.
- How do I handle products that are new this month?
- Build the product list from both months with UNIQUE(VSTACK(...)), and show 'new' instead of dividing by zero.
- Can I compare more than two months?
- Yes. Stack all monthly files with a Month column and pivot products by month.
- Should I compare totals or daily averages?
- Daily averages when months differ in length or trading days; totals when tracking against a monthly budget. Say which one you used.
- How do I show which products drove growth?
- Divide each product's change by last month's total: the contributions add up to the overall growth percentage.
- What if a product was renamed between months?
- Map the old and new names to one code before joining, or it shows as discontinued and new at the same time.