DAX Filter Context vs Row Context
Level: intermediate · ~16 min read · Intent: commercial
Audience: data analysts, finance teams, operations teams
Prerequisites
- basic spreadsheet literacy
- introductory Power BI concepts
Key takeaways
- Row context and filter context are different parts of DAX: row context evaluates logic one row at a time, while filter context defines the set of data visible to a calculation.
- Most DAX mistakes happen when users expect measures to behave like row-level formulas or expect calculated columns to behave like dynamic measures, so understanding context is one of the biggest steps toward writing reliable Power BI formulas.
FAQ
- What is row context in DAX?
- Row context is the evaluation context where DAX works through data one row at a time, which is common in calculated columns and iterator functions.
- What is filter context in DAX?
- Filter context is the set of filters applied to a calculation, coming from slicers, visuals, relationships, and DAX expressions, and it determines which data a measure can see.
- Why is filter context vs row context important in DAX?
- It is important because many common DAX errors and wrong results happen when users confuse row-based logic with filter-based logic, especially when moving from spreadsheets into Power BI.
- What is context transition in DAX?
- Context transition happens when DAX turns row context into filter context, most famously through CALCULATE, so an expression can be evaluated using the current row as a filter.
DAX filter context vs row context is one of the most important concepts in Power BI because it explains why formulas behave the way they do. It also explains why so many beginner formulas either return the wrong answer or fail completely. A lot of Power BI users do not really have a “function problem.” They have a context problem.
That is why this topic matters so much.
A user writes a measure and expects it to behave like a spreadsheet row formula. Another writes a calculated column and expects it to respond dynamically to slicers. Someone else sees the same measure return different values in a card, a table, and a chart and assumes something is broken.
Usually, nothing is broken. The context changed.
This guide explains the difference between row context and filter context in DAX, why they matter, where each one appears in Power BI, how they interact with measures and calculated columns, what context transition is, and how understanding these ideas makes DAX much easier to debug and design.
Overview
DAX has more than one kind of context, but the two most important contexts for most users are:
- row context
- filter context
Microsoft’s DAX overview describes filter context as the set of values allowed in a column or table and says it applies on top of other contexts such as row context. Microsoft’s Power BI quickstart on learning DAX basics also states that there are two types of context in DAX: row context and filter context. citeturn485147search1turn485147search10
A useful way to think about them is:
- row context asks: which row am I on?
- filter context asks: which slice of data is visible to this calculation?
That is the core distinction.
If you understand that difference, a huge amount of DAX becomes easier:
- measures
- calculated columns
- iterators
- CALCULATE
- time intelligence
- single-value errors
- lookup patterns
- debugging
This is one of the most important mental models in DAX.
What row context is
Row context is when DAX evaluates something one row at a time.
Microsoft’s Power BI DAX basics article describes row context as “the current row” and notes that it applies when a formula has a function that applies filters to identify a single row in a table. citeturn485147search10
That is why row context is most commonly associated with:
- calculated columns
- iterator functions such as SUMX
- row-level logic in table expressions
A simple practical way to understand row context is: DAX knows which row it is currently evaluating.
If a table has columns like:
- Product
- Quantity
- Unit Price
then in row context DAX can evaluate one row at a time and ask:
- what is Quantity for this row?
- what is Unit Price for this row?
- what is Quantity × Unit Price for this row?
That is row context.
Where row context appears most often
Calculated columns
Calculated columns are the easiest place to understand row context because DAX evaluates the formula for each row in the table.
For example, if you create:
- extended amount = quantity × unit price
in a calculated column, DAX has a current row while computing that value.
This is why calculated columns feel more familiar to spreadsheet users. They are row-oriented.
Iterator functions
Iterator functions such as:
- SUMX
- AVERAGEX
- FILTER in certain patterns
- RANKX in many designs
evaluate an expression across rows of a table.
That means row context often appears inside these functions too.
For example, SUMX can:
- evaluate quantity × unit price for each row
- then add the results
That is row context in action.
What filter context is
Filter context is the set of filters active when a DAX calculation is evaluated.
Microsoft’s DAX overview explains that filter context is added when you specify filter constraints on the set of values allowed in a column or table, and that it applies on top of other contexts such as row context. citeturn485147search1
Those filters can come from:
- slicers
- page filters
- report filters
- visual axes and categories
- table relationships
- CALCULATE and other DAX expressions
- interactions between visuals
A practical way to think about filter context is: it defines which subset of the model the measure can currently see.
If a measure is evaluated in a report filtered to:
- Year = 2026
- Region = South
- Category = Hardware
then that filter context shapes the result.
That is why the same measure can return different answers in different visuals.
Where filter context appears most often
Measures
Measures are where filter context becomes most obvious.
A measure such as:
- total revenue
does not return one fixed number forever. It returns:
- total revenue in the current context
That might mean:
- all revenue
- revenue for one month
- revenue for one region
- revenue for one category
- revenue for one selected segment
The formula did not change. The filter context changed.
This is one of the most important DAX ideas to learn.
Visuals and slicers
Visuals create context.
For example:
- a card may show total revenue for the whole report selection
- a bar chart by region evaluates the same measure separately per region
- a line chart by month evaluates the same measure separately per month
- a slicer changes which rows are visible to the measure
That is all filter context.
The simplest difference between row context and filter context
A very useful summary is:
Row context
Row context is about one row at a time.
Filter context
Filter context is about which rows are included in the calculation.
That distinction sounds small, but it explains a lot of Power BI behavior.
Row context helps DAX know:
- which row is current
Filter context helps DAX know:
- which subset of rows should be considered for the measure result
This is why a calculated column and a measure can behave so differently even when they sound like they should do the same thing.
Why spreadsheet users struggle with this
Spreadsheet users often expect formulas to behave like row-by-row logic by default.
That makes sense in Excel.
In Power BI, though, measures are not row formulas. They are context-aware calculations evaluated over filtered subsets of the model.
That is a huge mental shift.
A user moving from spreadsheets into DAX often expects:
- the formula to “run on each row”
But if the formula is a measure, DAX is usually asking:
- what is the summarized answer in the current filter context?
This is one of the biggest reasons DAX feels confusing at first.
A simple example of filter context
Suppose you create this measure:
Total Revenue = SUM(Sales[Revenue])
Now place it in:
- a card
- a table by Region
- a chart by Month
You will likely see different values in each visual.
That happens because:
- the card may show total revenue across the current report filters
- the table by Region applies a different filter context per region row
- the chart by Month applies a different filter context per month point
The measure is the same. The context changes.
That is filter context in practice.
A simple example of row context
Suppose your Sales table has:
- Quantity
- Unit Price
and you create a calculated column:
- Line Amount = Quantity × Unit Price
DAX evaluates that expression row by row.
For each row, it knows:
- which Quantity belongs to the row
- which Unit Price belongs to the row
That is row context.
This is why calculated columns feel much more like spreadsheet formulas than measures do.
Why measures do not automatically have row context
This is one of the most important beginner lessons.
Measures usually do not have row context by default.
That is why a measure that directly references a column without aggregation often fails with errors like:
- “A single value for column ... cannot be determined”
The reason is simple: the measure is not sitting on one row. It is sitting in a filter context that may include many rows.
If you want one summarized answer, you usually need:
- SUM
- MIN
- MAX
- AVERAGE
- DISTINCTCOUNT
- COUNTROWS
- another aggregation or scalar-producing pattern
This is one of the key differences between measures and row-based logic.
Why calculated columns do not behave like measures
The reverse confusion also happens.
A calculated column is computed row by row and stored in the model. It does not re-evaluate dynamically the way a measure does when users change slicers and filters.
That means calculated columns are not the right tool for:
- dynamic KPIs
- percentage of total
- current filter-dependent values
- time-intelligence measures
- interactive business metrics
Those are usually measure problems, which means they are filter-context problems.
How row context and filter context can work together
These contexts are different, but they can interact.
This is especially important in iterator functions and in CALCULATE.
For example:
- an iterator can create row context
- CALCULATE can modify filter context
- context transition can convert row context into filter context
This is why DAX becomes much more powerful once users stop thinking of row context and filter context as unrelated topics.
They are different, but they often work together in advanced measures.
What context transition is
Context transition is one of the most important advanced ideas that sits between row context and filter context.
Microsoft’s CALCULATE documentation states that CALCULATE used without filters performs a specific requirement: it transitions row context to filter context. The documentation also notes that this can happen in calculated column formulas or expressions evaluated in iterator functions. citeturn485147search2
A useful practical definition is:
Context transition is when DAX takes the current row context and turns it into filter context so an expression can be evaluated as a filtered calculation.
This is one reason CALCULATE is so important.
It helps bridge the two contexts.
Why CALCULATE matters in this comparison
CALCULATE matters because many DAX users first understand the difference between row context and filter context when they see CALCULATE change the result.
CALCULATE is useful because it can:
- add filters
- replace filters
- remove filters
- perform context transition when needed
This is why row context versus filter context is not just a theory question. It directly affects how some of the most important DAX functions behave.
Common mistakes caused by confusing row context and filter context
Mistake 1: Treating a measure like a row formula
A beginner writes a measure and directly references a column as if DAX were on one row.
That often causes:
- single-value errors
- wrong logic
- confusing results
Mistake 2: Treating a calculated column like a dynamic KPI
A user expects a calculated column to respond to slicers and report filters the way a measure does.
It does not.
Mistake 3: Using SUMX when a simple SUM would do
Sometimes users overuse iterators because row-by-row logic feels more intuitive, even when the business need is just a simple aggregation.
Mistake 4: Blaming the formula when the real problem is context
The syntax may be fine. The context assumption may be wrong.
Mistake 5: Ignoring context transition
Advanced formulas involving CALCULATE or iterators can be very hard to debug if you do not understand when row context becomes filter context.
A practical decision framework
If you are trying to tell whether a problem is about row context or filter context, ask these questions:
Question 1
Am I evaluating one row at a time?
If yes, row context is likely involved.
Question 2
Am I asking for a summarized answer in a report or visual?
If yes, filter context is likely involved.
Question 3
Does this logic belong in a calculated column or a measure?
- calculated column usually means row context
- measure usually means filter context
Question 4
Am I using an iterator such as SUMX or AVERAGEX?
If yes, row context is probably part of the logic.
Question 5
Am I using CALCULATE or modifying filters?
If yes, filter context is central, and context transition may also be involved.
This is one of the best ways to debug context issues quickly.
Real-world examples
Example 1: Total Revenue measure
Total Revenue = SUM(Sales[Revenue])
This is mostly a filter-context measure. Its value changes across visuals and slicers.
Example 2: Line Amount calculated column
Line Amount = Sales[Quantity] * Sales[Unit Price]
This is row context. DAX evaluates it row by row.
Example 3: SUMX over a row-level expression
A SUMX measure can create row context for the expression being evaluated across each row of the table, then return one final aggregated result in the current filter context.
This is one of the clearest places where both concepts meet.
Example 4: CALCULATE inside an iterator or calculated column
This is where context transition becomes important because CALCULATE can take row context and turn it into filter context for the calculation.
Step-by-step workflow
If you want to understand row context and filter context better, this is a strong process.
Step 1: Start with one simple measure
Create:
- Total Revenue = SUM(Sales[Revenue])
Then test it in:
- a card
- a table by region
- a chart by month
Watch how the value changes.
That is filter context.
Step 2: Create one simple calculated column
Create something like:
- Line Amount = Quantity × Unit Price
Look at how the formula works per row.
That is row context.
Step 3: Compare the two behaviors
Notice:
- the measure changes with visuals
- the calculated column exists as one stored value per row
Step 4: Test an iterator
Use something like SUMX in a practical scenario and observe how row-by-row evaluation feeds into one final measure result.
Step 5: Learn CALCULATE next
Once row context and filter context feel stable, CALCULATE becomes much easier to understand.
FAQ
What is row context in DAX?
Row context is the evaluation context where DAX works through data one row at a time, which is common in calculated columns and iterator functions.
What is filter context in DAX?
Filter context is the set of filters applied to a calculation, coming from slicers, visuals, relationships, and DAX expressions, and it determines which data a measure can see.
Why is filter context vs row context important in DAX?
It is important because many common DAX errors and wrong results happen when users confuse row-based logic with filter-based logic, especially when moving from spreadsheets into Power BI.
What is context transition in DAX?
Context transition happens when DAX turns row context into filter context, most famously through CALCULATE, so an expression can be evaluated using the current row as a filter.
Final thoughts
DAX filter context vs row context is one of the most important concepts to understand because it explains not just how formulas work, but why they work differently in different parts of Power BI.
That is the main lesson.
Row context is about the current row. Filter context is about the current slice of the model.
Once that difference clicks, a lot of DAX suddenly becomes easier:
- measures make more sense
- calculated columns make more sense
- iterator functions feel less mysterious
- CALCULATE becomes easier to place
- debugging becomes much faster
That is why this is not just a theory topic. It is one of the biggest foundations of writing correct DAX in real reporting work.