← back to blog
Power BI10 min readNovember 2025

I've Built 200+ Power BI Dashboards. These 8 DAX Measures Are in Every Single One.

Copy-paste ready
Financial data dashboard

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"