How to Create a Measure vs a Calculated Column in Power BI
Key Takeaways
- A calculated column adds a new field to an existing Power BI table and produces one value for every row, normally during data refresh.
- A measure calculates an aggregated result on demand and changes according to the filters, slicers, rows, and columns in a report visual.
- Use a calculated column when you need a row-level attribute for filtering, grouping, sorting, or slicing.
- Use a measure for business results such as revenue, margin, counts, averages, ratios, and percentages.
- Calculated columns are stored in the model, so they can increase model size and refresh time; measures are evaluated when a visual needs them.
- The simplest decision rule is: filter or group with a column; calculate a value with a measure.
Introduction
Power BI gives you several ways to add calculations to a semantic model, but two of the most commonly confused options are the calculated column and the measure. Both are written in DAX, both can appear in the Fields pane, and both can be used in report visuals. Despite those similarities, they solve different problems.
A calculated column creates a new column inside a table. Power BI evaluates its formula once for each row and stores the result with the table. If you create a calculated column called Line Revenue on a sales table, every sales row receives its own revenue value. That value becomes part of the model, just like a column imported from a database.
A measure is different. It does not add a column of stored values to a table. Instead, it defines a calculation that Power BI evaluates when a visual asks for it. If you create a measure called Total Revenue, its result depends on what the user has selected. A card visual with no filters might show total company revenue, while a matrix visual filtered to one product shows revenue for that product only.
That distinction matters because it affects what you can build, how your report behaves, and how your model performs. A calculated column is useful when you need a new field for slicing, filtering, grouping, or sorting. A measure is useful when you need a result that responds to the report context.
This guide explains how to create both, when to use each one, how they behave in real reports, and where beginners most often go wrong. It also includes worked examples using a small sales dataset so you can see exactly what each calculation produces.
Sample model
The examples use a simple Sales table containing six order lines. The table has no relationships to other tables, which keeps the focus on the difference between row-level calculations and aggregate calculations.
| OrderID | Date | Product | Quantity | UnitPrice | Cost |
|---|---|---|---|---|---|
| 1001 | 2026-01-05 | Laptop | 2 | 1,200 | 900 |
| 1002 | 2026-01-18 | Laptop | 1 | 1,200 | 900 |
| 1003 | 2026-02-03 | Monitor | 3 | 320 | 240 |
| 1004 | 2026-02-21 | Monitor | 2 | 320 | 240 |
| 1005 | 2026-03-08 | Keyboard | 5 | 45 | 30 |
| 1006 | 2026-03-27 | Keyboard | 4 | 45 | 30 |
From this data, the total revenue across all six rows is 5,605. Total cost is 4,170, and total margin is 1,435. That produces a margin percentage of 25.6%.
The product-level revenue is:
| Product | Total Revenue |
|---|---|
| Laptop | 3,600 |
| Monitor | 1,600 |
| Keyboard | 405 |
| Total | 5,605 |
These numbers will be used throughout the post to show how a measure changes depending on the filters applied in a visual.
What is a calculated column?
A calculated column is a new column added to a table in the Power BI semantic model. You define it with a DAX formula, and Power BI evaluates that formula for every row in the table.
For example, if you want to calculate revenue for each sales line, you can create a calculated column that multiplies quantity by unit price. Each row receives its own result. The first row might produce 2,400, the second 1,200, the third 960, and so on.
The important point is that the result belongs to the row. Order 1001 has a revenue value. Order 1002 has a different revenue value. The column stores those individual values in the model.
Calculated columns are most useful when the value is an attribute of the row rather than an aggregate across many rows. Examples include:
- Revenue for each transaction line
- Profit for each transaction line
- Customer age group
- Product price band
- Weekday or weekend label
- Month name
- Sort order for month names
- A flag identifying late shipments
- A category derived from another column
Microsoft describes calculated columns as DAX formulas that add new data to a table already in the model, with values evaluated row by row. [web:35] In Power BI’s calculation options, calculated columns are computed at data refresh and stored in the model. [web:32]
Row context in calculated columns
A calculated column operates in row context. That means DAX knows which row it is evaluating and can refer to values from that row.
In this formula:
Line Revenue =
Sales[Quantity] * Sales[UnitPrice]
DAX reads Quantity and UnitPrice from the current row. It does not add them across the table. It simply performs the multiplication separately for every row.
For order 1001, the calculation is:
2 * 1,200 = 2,400
For order 1003, the calculation is:
3 * 320 = 960
For order 1005, the calculation is:
5 * 45 = 225
This row-by-row behavior is why calculated columns are ideal for creating descriptive fields, labels, categories, and row-level numeric values.
How to create a calculated column
Creating a calculated column in Power BI Desktop takes only a few steps. The important part is understanding that you are adding a field to the model, not creating a dynamic report calculation.
Step 1: Open Table view
Open your Power BI Desktop file and select Table view from the left-hand navigation bar. Table view shows the actual rows and columns in your semantic model.
Select the table where you want to add the new column. In this example, select the Sales table.
You can also create a calculated column from Model view or by right-clicking a table in the Data pane. Table view is usually the easiest place to start because you can immediately see the new column appear beside the existing data.
Step 2: Select New column
With the Sales table selected, go to the Table tools ribbon and choose New column.
Power BI places the cursor in the formula bar and adds a default formula:
Column =
You can now replace Column with a meaningful name.
Naming matters. A name such as Column tells report users nothing. A name such as Line Revenue, Customer Age Band, or High Value Order immediately communicates what the field contains.
Step 3: Write the DAX formula
Enter this formula:
Line Revenue =
Sales[Quantity] * Sales[UnitPrice]
Press Enter or click the check mark beside the formula bar.
Power BI evaluates the expression for every row in the Sales table and creates a new column called Line Revenue.
The result is:
| OrderID | Quantity | UnitPrice | Line Revenue |
|---|---|---|---|
| 1001 | 2 | 1,200 | 2,400 |
| 1002 | 1 | 1,200 | 1,200 |
| 1003 | 3 | 320 | 960 |
| 1004 | 2 | 320 | 640 |
| 1005 | 5 | 45 | 225 |
| 1006 | 4 | 45 | 180 |
The calculated column now behaves like any other column in the model. You can drag it into a table visual, use it in a slicer, sort by it, or apply a filter to it.
Step 4: Format the column
Select the new Line Revenue column in the Data pane. In the Column tools ribbon, choose a suitable format.
For currency values, select Currency or Fixed decimal. Set the number of decimal places based on your reporting needs. For most sales and finance reports, two decimal places is a sensible default.
Formatting does not change the underlying value. It only changes how Power BI displays the number in visuals.
Step 5: Create a classification column
Calculated columns are especially useful for creating categories. Suppose you want to identify high-value orders.
Enter this formula:
High Value Order =
IF(
Sales[Quantity] * Sales[UnitPrice] > 1000,
"High Value",
"Standard"
)
This formula checks the revenue of each row. If revenue is greater than 1,000, it returns High Value. Otherwise, it returns Standard.
The result is:
| OrderID | Line Revenue | High Value Order |
|---|---|---|
| 1001 | 2,400 | High Value |
| 1002 | 1,200 | High Value |
| 1003 | 960 | Standard |
| 1004 | 640 | Standard |
| 1005 | 225 | Standard |
| 1006 | 180 | Standard |
You can now place High Value Order in a slicer. When a report user selects High Value, Power BI filters the report to orders 1001 and 1002.
This is a good use of a calculated column because the label is a property of the individual order. It does not need to change when the user filters the report.
What is a measure?
A measure is a named DAX calculation that Power BI evaluates in the context of a visual. Unlike a calculated column, a measure does not store a value for every row.
Instead, Power BI calculates the measure whenever a visual needs it. If a card visual displays Total Revenue, Power BI evaluates the measure once for that card. If a matrix visual shows revenue by product, Power BI evaluates the measure separately for each product row.
This is why measures are dynamic. The same measure can return different results in different parts of a report.
Microsoft defines measures as dynamic calculation formulas whose results change depending on context, and notes that they are used in reporting scenarios involving filtering and combining data. [web:31] In Power BI Desktop, measures are calculated on demand rather than during data refresh. [web:32]
Filter context in measures
Measures operate in filter context. Filter context is the set of filters applied to a calculation by the report page, slicers, visual filters, and the structure of the visual itself.
For example, imagine a matrix with Product on the rows and Total Revenue in the values area.
For the Laptop row, the filter context is:
Product = Laptop
Power BI evaluates Total Revenue using only laptop rows. The result is 3,600.
For the Monitor row, the filter context is:
Product = Monitor
Power BI evaluates the same measure using only monitor rows. The result is 1,600.
For the Keyboard row, the result is 405.
For the total row, there is no product filter, so Power BI evaluates the measure across all six rows. The result is 5,605.
The measure did not change. The filter context changed.
How to create a measure
Creating a measure is similar to creating a calculated column, but the result behaves very differently in a report.
Step 1: Select New measure
In Power BI Desktop, go to Table view, Report view, or Model view. Right-click the Sales table in the Data pane and choose New measure.
You can also select New measure from the Home ribbon.
Power BI adds a placeholder formula:
Measure =
Replace Measure with a descriptive name.
Measures created manually appear in the Data pane with a calculator icon. [web:39] That icon is a useful visual reminder that the field is an aggregation, not a stored column.
Step 2: Create a revenue measure
Enter this formula:
Total Revenue =
SUMX(
Sales,
Sales[Quantity] * Sales[UnitPrice]
)
SUMX iterates through the rows visible in the current filter context. For each row, it calculates quantity multiplied by unit price. It then adds those row-level results together.
With no filters applied, the measure returns 5,605.
If you place the measure in a matrix with Product on rows, you get:
| Product | Total Revenue |
|---|---|
| Laptop | 3,600 |
| Monitor | 1,600 |
| Keyboard | 405 |
| Total | 5,605 |
This is the core value of a measure. One formula produces the correct result at every level of the visual.
Step 3: Create a margin measure
You can create a margin measure using the same pattern:
Total Margin =
SUMX(
Sales,
Sales[Quantity] * (Sales[UnitPrice] - Sales[Cost])
)
For each row, this formula calculates revenue minus cost, then multiplies the result by quantity. SUMX adds the margin from every visible row.
With no filters, the measure returns 1,435.
By product, the result is:
| Product | Total Margin |
|---|---|
| Laptop | 900 |
| Monitor | 400 |
| Keyboard | 135 |
| Total | 1,435 |
Again, the measure adapts to the visual. It does not require a separate formula for each product.
Step 4: Create a margin percentage measure
A margin percentage is a ratio, so it should almost always be a measure.
Margin % =
DIVIDE(
[Total Margin],
[Total Revenue]
)
DIVIDE performs division safely. If the denominator is zero or blank, it returns BLANK() rather than producing a divide-by-zero error.
For the full sample dataset, margin percentage is:
1,435 / 5,605 = 25.6%
Format the measure as a percentage in the Measure tools ribbon. The result should display as 25.6%.
Calculated column vs measure
The fastest way to understand the difference is to compare how each calculation behaves in a report.
| Aspect | Calculated column | Measure |
|---|---|---|
| Main purpose | Adds a row-level field to a table | Calculates an aggregated result |
| DAX evaluation | Once per row | Once per visual cell or calculation |
| Evaluation context | Row context | Filter context |
| When calculated | During model processing or refresh | On demand, when a visual needs it |
| Stored values | Yes, for Import-mode tables | No; results are not stored as rows |
| Changes with slicers | No | Yes |
| Typical use | Categories, flags, labels, sort keys, row-level values | Revenue, cost, margin, ratios, counts, averages |
| Model impact | Can increase model size and refresh duration | Generally lighter for stored-model size |
| Visual placement | Rows, columns, legends, slicers, filters | Values and visual-level filters |
| Best default choice | When you need a new field | When you need a KPI or aggregate |
Microsoft’s own calculation comparison makes the same distinction: calculated columns are computed at refresh and saved, while measures are calculated as needed and respond to report interaction. [web:32]
When to use a calculated column
Use a calculated column when the result is an attribute of a single row and you need to use that attribute as a field in the report.
A good test is to ask: “Does this value belong to this row, regardless of what the user filters?”
If the answer is yes, a calculated column is usually appropriate.
Customer age bands
Suppose you have a Customers table with a birth date column. You can create an age band column:
Age Band =
SWITCH(
TRUE(),
DATEDIFF(Customers[BirthDate], TODAY(), YEAR) < 26, "18-25",
DATEDIFF(Customers[BirthDate], TODAY(), YEAR) < 41, "26-40",
DATEDIFF(Customers[BirthDate], TODAY(), YEAR) < 56, "41-55",
"56+"
)
This creates a reusable field that can be placed in a slicer, used as a matrix row, or added as a legend.
You would not usually create this as a measure because an age band is not an aggregate. It is a descriptive attribute of each customer.
Product price bands
You can create a price band for products:
Price Band =
SWITCH(
TRUE(),
Products[UnitPrice] >= 1000, "Premium",
Products[UnitPrice] >= 300, "Mid-Range",
"Budget"
)
This gives report users a simple way to filter products by pricing category.
Date labels
Date tables often benefit from calculated columns such as:
Month Name = FORMAT(Dates[Date], "MMMM")
Month Number = MONTH(Dates[Date])
Year Month =
FORMAT(Dates[Date], "YYYY-MM")
A month number column is particularly useful for sorting month names correctly. Without it, Power BI may sort April, August, December alphabetically rather than chronologically.
Row-level flags
Flags are another strong use case:
Is Weekend =
IF(
WEEKDAY(Sales[Date], 2) >= 6,
TRUE(),
FALSE()
)
This creates a Boolean field that identifies weekend transactions. You can use it in a slicer or as a filter condition.
When to use a measure
Use a measure when the result should respond to filters or when you need an aggregate.
A good test is to ask: “Should this number change when the user selects a different year, region, product, or customer?”
If the answer is yes, use a measure.
Revenue
Revenue is the classic measure:
Total Revenue =
SUMX(
Sales,
Sales[Quantity] * Sales[UnitPrice]
)
It should respond to product filters, date filters, region filters, customer filters, and any other slicer in the report.
Cost
Total Cost =
SUMX(
Sales,
Sales[Quantity] * Sales[Cost]
)
For the sample dataset, this returns 4,170 with no filters.
Margin
Total Margin =
[Total Revenue] - [Total Cost]
This measure returns 1,435 for the full dataset. It also returns the correct margin for any filtered subset.
Order count
Order Count =
DISTINCTCOUNT(Sales[OrderID])
This counts unique orders rather than individual sales lines. If one order contains several product lines, DISTINCTCOUNT prevents double counting.
Average revenue per order
Average Revenue per Order =
DIVIDE(
[Total Revenue],
[Order Count]
)
This is a measure because both the numerator and denominator should change with report filters.
Implicit measures vs explicit measures
Power BI can create an implicit measure automatically when you drag a numeric column into a visual. For example, if you drag Quantity into a card visual, Power BI may sum it by default.
An implicit measure is quick, but it has limitations. You cannot easily control its formatting, reuse it across visuals, or give it a meaningful business name.
An explicit measure is one you create deliberately with DAX. It has a clear name, defined logic, controlled formatting, and can be reused throughout the report.
For professional reports, prefer explicit measures. For example, instead of relying on Power BI to sum Quantity, create:
Total Quantity =
SUM(Sales[Quantity])
This makes the report easier to maintain and gives every calculation a clear owner.
Calculated columns vs Power Query custom columns
A calculated column is not the only way to add a field to a table. Power Query also lets you create a custom column.
The difference is where the calculation happens.
| Aspect | Power Query custom column | DAX calculated column |
|---|---|---|
| Language | M | DAX |
| Created in | Power Query Editor | Power BI semantic model |
| Evaluated | During data refresh | During model processing or refresh |
| Best for | Data preparation and source-level transformations | Model-level attributes and DAX-specific logic |
| Can use relationships | No | Yes |
| Can use model context | No | Yes |
Use Power Query when the logic belongs in data preparation. Examples include cleaning text, splitting values, changing data types, parsing dates, or deriving a field directly from source columns.
Use a DAX calculated column when the logic depends on the model, such as values from related tables or DAX functions that are not available in M.
Microsoft distinguishes these clearly: custom columns use M, calculated columns use DAX, and both are computed at data refresh, while measures are calculated on demand. [web:32]
Calculated columns vs calculated tables
A calculated table is another DAX-based model object. Instead of adding one column to an existing table, it creates an entirely new table.
For example:
Product Summary =
SUMMARIZE(
Sales,
Sales[Product],
"Total Quantity", SUM(Sales[Quantity])
)
This creates a new table with one row per product and a total quantity value.
Use a calculated table when you need a new table for modeling purposes, such as a date table, a segmentation table, or a simplified summary table. Use a calculated column when you only need to add a field to a table that already exists.
Performance considerations
Performance is one of the most practical reasons to choose carefully between calculated columns and measures.
Calculated columns and model size
In an Import-mode model, calculated columns are evaluated and stored. Every row receives a value. If you add several calculated columns to a large fact table, you increase the amount of data Power BI must store and process.
That does not mean calculated columns are bad. They are sometimes necessary. But they should be intentional.
Avoid creating calculated columns for values that could be calculated as measures. For example, do not create a calculated column that stores total company revenue on every sales row. That produces the same repeated value across millions of rows and wastes model space.
Measures and query performance
Measures are evaluated when needed. A simple measure usually performs well, but a complex measure evaluated many times in a large visual can become expensive.
For example, a matrix with many rows, columns, and a complex time-intelligence measure may force Power BI to evaluate the measure repeatedly. If performance becomes a problem, simplify the calculation, reduce visual complexity, or use a more efficient DAX pattern.
DirectQuery considerations
In DirectQuery mode, calculated columns can be more expensive because the DAX expression may need to be translated into a query against the source database. Avoid unnecessary calculated columns in DirectQuery models, especially on large fact tables.
Measures are often preferable in DirectQuery because they can be pushed down to the source as part of the query, depending on the DAX pattern and the data source.
Common mistakes
Using a calculated column for a total
A frequent beginner mistake is writing this as a calculated column:
Total Revenue =
SUM(Sales[Quantity] * Sales[UnitPrice])
This does not create a useful row-level value. It attempts to calculate an aggregate, but the result is repeated on every row of the table.
Use a measure instead:
Total Revenue =
SUMX(
Sales,
Sales[Quantity] * Sales[UnitPrice]
)
Using a measure as a slicer
Measures are not designed to be used as slicers, matrix rows, or legends. They are values that respond to filters.
If you need a slicer, create a column. If you need a dynamic KPI, create a measure.
Assuming calculated columns respond to slicers
A calculated column is evaluated and stored at the row level. It does not recalculate when a user selects a different year, product, or region.
For example, this calculated column:
High Value Order =
IF(
Sales[Quantity] * Sales[UnitPrice] > 1000,
"High Value",
"Standard"
)
Will always label order 1001 as High Value. A slicer can filter that row in or out of a visual, but it cannot change the stored label.
Creating too many calculated columns
Each calculated column adds a stored value for every row in an Import-mode table. That can increase model size and refresh time.
Microsoft specifically cautions against excessive calculated columns and recommends considering a measure instead when appropriate. [web:37]
Confusing Power Query custom columns with DAX calculated columns
A Power Query custom column is part of data preparation. A DAX calculated column is part of the semantic model.
If you are cleaning or reshaping source data, use Power Query. If you need a modeling attribute that uses DAX or relationships, use a calculated column.
In Practice
Imagine you are building a sales report for a retail team. The team needs to analyze revenue, margin, and order value by product and month.
Start by creating two calculated columns.
First, create a revenue column:
Line Revenue =
Sales[Quantity] * Sales[UnitPrice]
Second, create an order-size classification:
Order Size =
IF(
Sales[Quantity] * Sales[UnitPrice] > 1000,
"High Value",
"Standard"
)
Then create three measures:
Total Revenue =
SUMX(
Sales,
Sales[Quantity] * Sales[UnitPrice]
)
Total Margin =
SUMX(
Sales,
Sales[Quantity] * (Sales[UnitPrice] - Sales[Cost])
)
Margin % =
DIVIDE(
[Total Margin],
[Total Revenue]
)
Build a matrix visual with Product on rows. Add Total Revenue and Margin % to values. Add Order Size as a slicer.
Without any slicer selection, the report shows:
| Product | Total Revenue | Margin % |
|---|---|---|
| Laptop | 3,600 | 25.0% |
| Monitor | 1,600 | 25.0% |
| Keyboard | 405 | 33.3% |
| Total | 5,605 | 25.6% |
When the user selects High Value in the slicer, only laptop orders remain visible. Total revenue becomes 3,600, and the margin calculation updates for that filtered subset.
The calculated column determines which rows qualify as High Value. The measures calculate the results for whichever rows remain visible.
That is the practical division of labor: the calculated column defines a row-level attribute, while the measures calculate dynamic business results.
Decision framework
Use this simple framework when deciding which calculation to create.
| Question | Best choice |
|---|---|
| Do I need a slicer, filter, row, column, or legend? | Calculated column |
| Does the value belong to one row? | Calculated column |
| Am I creating a category, label, flag, or sort key? | Calculated column |
| Should the result change with slicers? | Measure |
| Am I calculating a total, average, count, or percentage? | Measure |
| Am I building a KPI? | Measure |
| Am I cleaning or reshaping source data? | Power Query custom column |
| Am I creating a new table for modeling? | Calculated table |
When in doubt, start with a measure. Most reporting calculations should be measures. Add a calculated column only when you genuinely need a new field in the model.
Frequently Asked Questions
How do I create a measure in Power BI?
Right-click a table in the Data pane, choose New measure, and enter a DAX formula in the formula bar. For example: Total Revenue = SUMX(Sales, Sales[Quantity] * Sales[UnitPrice]).
How do I create a calculated column in Power BI?
Select your table in Table view, choose New column, and write a DAX formula that returns one value per row. For example: Line Revenue = Sales[Quantity] * Sales[UnitPrice].
Should I use a measure or calculated column for profit?
Use a measure. Profit depends on aggregation and report filters. A measure such as SUMX(Sales, Sales[Quantity] * (Sales[UnitPrice] - Sales[Cost])) responds correctly to slicers and visuals.
Should I use a measure or calculated column for customer age groups?
Use a calculated column if you need a reusable slicer or grouping field. It assigns an age band to each customer row, such as 18–25 or 26–40.
Do calculated columns slow down Power BI?
They can. In Import-mode models, calculated columns are evaluated and stored, so they can increase model size and refresh time, especially when there are many columns or complex formulas.
Do measures store data in the Power BI model?
No. Measures are evaluated when a report visual requests them; their results are not stored as rows in the model.
Can a calculated column use data from another table?
Yes. A calculated column can refer to related tables through model relationships, often using DAX functions such as RELATED.
Can a measure be used in a slicer?
No. Measures are designed for values and visual-level filters, not slicers, matrix rows, or legends. Use a calculated column when you need a slicer field.
Which should beginners learn first?
Learn measures first. Most reporting calculations—totals, averages, counts, percentages, and KPIs—should be measures. Learn calculated columns when you need a new field for filtering, grouping, or sorting.