I've Built 200+ Power BI Dashboards. These 8 DAX Measures Are in Every Single One.
The Thing Everyone Gets Wrong on Their First Dashboard
On your first Power BI dashboard, you drag a column into a card visual and it shows a number. That number is a SUM. You don't question it. It looks right. You move on.
Six months later, a stakeholder asks "but what about this period vs. last period?" and you realize you've built the entire model without time intelligence. No YTD. No MTD. No period comparison. Just a static sum that answers one question and only one question.
I've seen this at startups and at ASX-listed companies. The first dashboard always misses time intelligence. These 8 measures are what I add before anything else — they're the infrastructure every insight-driven report needs to stand on.
Measure 1: Year-to-Date (YTD)
The most-requested metric in every business review. TOTALYTD handles the date logic automatically — it always runs from January 1 of the current year to the latest date in your filter context.
Revenue YTD =
TOTALYTD(
SUM(Sales[Revenue]),
Dates[Date]
)
Use this for KPI cards and any "cumulative performance" visual. The Dates[Date] must reference a proper date table marked as a date table in your model.
Measure 2: Month-to-Date (MTD)
Same logic, smaller window. Essential for operational dashboards where month performance is the primary lens.
Revenue MTD =
TOTALMTD(
SUM(Sales[Revenue]),
Dates[Date]
)
Measure 3: Month-over-Month % Change
This is where most analysts make their first CALCULATE mistake. You need DATEADD to shift the filter context back one month — not PREVIOUSMONTH, which has edge cases around partial months.
Revenue MoM % =
VAR CurrentMonth = SUM(Sales[Revenue])
VAR PreviousMonth =
CALCULATE(
SUM(Sales[Revenue]),
DATEADD(Dates[Date], -1, MONTH)
)
RETURN
DIVIDE(
CurrentMonth - PreviousMonth,
PreviousMonth,
BLANK()
)
Always use DIVIDE instead of division with a slash — DIVIDE handles zero denominators gracefully and returns BLANK() instead of an error, which lets conditional formatting work properly.
Measure 4: Rolling 12-Month Revenue
For businesses with seasonality, YTD is misleading in January. Rolling 12 months smooths seasonal variation and gives an honest view of trajectory.
Revenue Rolling 12M =
CALCULATE(
SUM(Sales[Revenue]),
DATESINPERIOD(
Dates[Date],
LASTDATE(Dates[Date]),
-12,
MONTH
)
)
Measure 5: % of Total
Indispensable for any breakdown visual — product category, region, channel. Shows relative contribution in a filter context.
Revenue % of Total =
DIVIDE(
SUM(Sales[Revenue]),
CALCULATE(
SUM(Sales[Revenue]),
ALL(Sales[Category]) -- remove the category filter
),
BLANK()
)
Replace Sales[Category] with whatever dimension you're breaking down. The ALL() removes that filter while keeping all other active filters (date, region, etc.).
Measure 6: Rank
Used in every "top N" table and leaderboard. RANKX with ALL() ranks items within the current filter context.
Product Rank by Revenue =
RANKX(
ALL(Products[ProductName]),
[Revenue MTD],
,
DESC,
DENSE
)
Use DENSE ranking to avoid gaps in the sequence when values tie. Use this with a TopN filter on your visual to build proper leaderboards.
Measure 7: Variance to Target
Every performance dashboard needs a target comparison. This assumes you have a Targets table with a Budget column keyed to the same date/category structure as your actuals.
Variance to Target =
VAR Actual = SUM(Sales[Revenue])
VAR Target = SUM(Targets[Budget])
RETURN
DIVIDE(
Actual - Target,
Target,
BLANK()
)
Format this as a percentage and use conditional formatting (green for positive, red for negative) on a KPI card. Pair it with an absolute variance measure (Actual - Target) for the tooltip.
Measure 8: Dynamic Title
This one is underused and always impresses. Instead of a static title that says "Monthly Revenue," the visual title updates based on whatever the user has selected in slicers.
Dynamic Chart Title =
VAR SelectedPeriod =
IF(
ISFILTERED(Dates[Month]),
SELECTEDVALUE(Dates[MonthName], "Multiple Months"),
"All Periods"
)
VAR SelectedRegion =
SELECTEDVALUE(Regions[RegionName], "All Regions")
RETURN
"Revenue — " & SelectedPeriod & " | " & SelectedRegion
Assign this measure to the visual title field (in the Format pane → Title → Text → fx). The title now reads "Revenue — March 2026 | Asia Pacific" when those selections are active.
A good DAX model answers questions users haven't asked yet. These 8 measures are the foundation. Everything else is built on top of them.
The Model Behind the Measures
None of these work without a proper date table. Before you write a single measure, create a complete date table with no gaps between your earliest transaction and today, mark it as a date table, and relate it to every fact table in your model. That's the one step that makes everything else possible.
- Always use explicit measures — never implicit
- DIVIDE over the division operator, always
- VAR/RETURN pattern for any measure with more than one calculation step
- Test measures with the "View As" role feature before publishing
- Name measures with spaces for readability: "Revenue MTD", not "RevenueMTD"