Web Hosting Blog by Nest Nepal | Domain & Hosting Tips

Understanding DAX (Data Analysis Expressions) with Simple Examples

Let’s be honest—DAX scares the crap out of most people when they first see it. You’re cruising along in Power BI, dragging and dropping fields like a pro, and then suddenly you need to write some formula that looks like alien code.

DAX

But here’s the thing: DAX isn’t actually that hard once you understand the basics. It’s just different from Excel formulas, and that’s where people get tripped up. Let me walk you through it with examples that actually make sense.

What the Hell is DAX Anyway?

DAX stands for Data Analysis Expressions. It’s the formula language that Power BI (and Excel Power Pivot and Analysis Services) uses to create calculated columns, measures, and calculated tables.

Think of it like this:

  • Excel formulas work on individual cells
  • DAX formulas work on entire columns and tables

That’s the fundamental shift you need to wrap your head around.

DAX vs Excel: The Mental Shift

Excel ThinkingDAX Thinking
=A1*B1= Sales[Quantity] * Sales[Price]
Works on single cellsWorks on entire columns
SUM(A1:A100)SUM(Sales[Amount])
References rangesReferences tables and columns

The Two Main Types of DAX Formulas

Calculated Columns

These create new columns in your tables. They’re calculated row by row, like Excel formulas.

When to use: When you need a value for each row that you can filter or group by.

Measures

These are dynamic calculations that change based on context (filters, slicers, etc.).

When to use: When you need aggregated values that respond to user interactions.

Let’s Start with Simple Calculated Columns

Example 1: Basic Math

Say you have a Sales table with Quantity and Unit Price columns, and you want the Total Amount:

Total Amount = Sales[Quantity] * Sales[UnitPrice]

This multiplies the quantity by the unit price for each row. Simple enough, right?

Example 2: Text Manipulation

Want to combine first and last names?

Full Name = Customers[FirstName] & ” ” & Customers[LastName]

The & operator concatenates text in DAX (like Excel).

Example 3: Conditional Logic

Let’s categorize sales amounts:

Sales Category =

IF(

    Sales [Amount] > 1000,

    “High Value”,

    IF(

        Sales [Amount] > 500,

        “Medium Value”,

        “Low Value”

    )

)

This creates a nested IF statement. Each row gets categorized based on its sales amount.

Now Let’s Talk Measures (The Real Power)

Measures are where DAX gets interesting. They’re dynamic and change based on what’s selected in your report.

Example 4: Basic Aggregation

Total Sales = SUM (Sales[Amount])

This looks simple, but here’s the magic: this measure will show different values depending on what’s filtered. If a user selects “January” in a date slicer, it shows January sales. If they select “Product A”, it shows Product A sales.

Example 5: Counting Things

Number of Customers = DISTINCTCOUNT(Sales[CustomerID])

DISTINCTCOUNT counts unique values. This measure tells you how many different customers made purchases (based on current filters).

Example 6: Averages That Make Sense

Average Order Value = DIVIDE(SUM(Sales[Amount]), DISTINCTCOUNT(Sales[OrderID]))

This calculates average order value properly—total sales divided by the number of unique orders. The DIVIDE function handles division by zero gracefully.

Time Intelligence: The DAX Superpower

DAX has built-in functions for time-based calculations that would be a nightmare in Excel.

Example 7: Year-to-Date

YTD Sales = TOTALYTD(SUM(Sales[Amount]), Calendar[Date])

This automatically calculates year-to-date sales based on the current filter context. Select any date, and it shows YTD through that date.

Example 8: Previous Month

Previous Month Sales = CALCULATE(

    SUM(Sales[Amount]),

    PREVIOUSMONTH(Calendar[Date])

)

CALCULATE is probably the most important DAX function. It changes the filter context. Here, it’s saying, “Calculate sales but for the previous month instead of the current selection.”

Example 9: Month-over-Month Growth

MoM Growth % =

VAR CurrentMonth = SUM(Sales[Amount])

VAR PreviousMonth = CALCULATE(SUM(Sales[Amount]), PREVIOUSMONTH(Calendar[Date]))

RETURN

    DIVIDE(CurrentMonth – PreviousMonth, PreviousMonth) * 100

This introduces VAR (variables)—a way to store intermediate calculations and make your formulas readable.

Filter Context: The Thing That Confuses Everyone

Filter context is what makes measures dynamic. It’s the combination of:

  • What row you’re looking at (row context)
  • What filters are applied (filter context)

Example 10: Understanding Context

Sales for Product A = CALCULATE(

    SUM(Sales[Amount]),

    Products[ProductName] = “Product A”

)

This measure always shows sales for Product A, regardless of what’s selected. The CALCULATE function overrides the current filter context.

Example 11: Multiple Filters

High Value Sales This Year = CALCULATE(

    SUM(Sales[Amount]),

    Sales[Amount] > 1000,

    YEAR(Sales[Date]) = YEAR(TODAY())

)

You can stack multiple filter conditions in CALCULATE. This shows sales over $1000 for the current year only.

Practical Examples You’ll Actually Use

Example 12: Running Total

Running Total = 

CALCULATE(

    SUM(Sales[Amount]),

    FILTER(

        ALL(Sales[Date]),

        Sales[Date] <= MAX(Sales[Date])

    )

)

This creates a running total that accumulates as you move through dates. ALL removes filters, then FILTER applies a new condition.

Example 13: Ranking

Customer Rank = RANKX(ALL(Customers), [Total Sales],, DESC)

RANKX ranks customers by their total sales. ALL(Customers) ensures ranking is done across all customers, not just the visible ones.

Example 14: Percentage of Total

% of Total Sales = 

DIVIDE(

    SUM(Sales[Amount]),

    CALCULATE(SUM(Sales[Amount]), ALL(Sales))

)

This shows what percentage each item represents of the grand total.

Common DAX Functions You Should Know

FunctionWhat It DoesExample Use
SUM()Adds up valuesSUM(Sales[Amount])
COUNT()Counts non-blank valuesCOUNT(Sales[OrderID])
DISTINCTCOUNT()Counts unique valuesDISTINCTCOUNT(Sales[CustomerID])
AVERAGE()Calculates averageAVERAGE(Sales[Amount])
CALCULATE()Changes filter contextCALCULATE(SUM(Sales[Amount]), Sales[Region] = “East”)
IF()Conditional logicIF(Sales[Amount] > 1000, “High”, “Low”)
DIVIDE()Safe divisionDIVIDE(Sales[Profit], Sales[Amount])
RELATED()Gets value from related tableRELATED(Products[Category])

DAX Best Practices That Matter

1. Use Variables for Readability

Bad:

Profit Margin = DIVIDE(SUM(Sales[Amount]) – SUM(Sales[Cost]), SUM(Sales[Amount]))

Good:

Profit Margin = 

VAR Revenue = SUM(Sales[Amount])

VAR Cost = SUM(Sales[Cost])

RETURN

    DIVIDE(Revenue – Cost, Revenue)

2. Use DIVIDE Instead of Division Operator

Bad: = Sales[Profit] / Sales[Revenue] (crashes on zero) Good: = DIVIDE(Sales[Profit], Sales[Revenue]) (returns blank on zero)

3. Be Explicit with Table Names

Bad: = SUM(Amount) Good: = SUM(Sales[Amount])

4. Use Measures, Not Calculated Columns for Aggregations

If you’re summing, counting, or averaging, use a measure. Calculated columns are for row-level calculations.

Debugging DAX (When Things Go Wrong)

Common Error Messages and Fixes

“Circular dependency detected”

  • You’re referencing a column/measure that references itself
  • Check your formula for self-references

“A table of multiple values was supplied where a single value was expected”

  • Usually happens when you use a function expecting a single value but get multiple
  • Wrap in an aggregation function like SUM() or use VALUES()

“Cannot find table/column”

  • Typo in table or column name
  • Table/column was renamed or deleted

Quick Debugging Tips

  1. Use VAR to break down complex formulas
  2. Create simple versions first, then add complexity
  3. Use the DAX Studio tool for advanced debugging
  4. Test with simple data first

Learning Path: What to Master Next

  1. Start here: Basic aggregations (SUM, COUNT, AVERAGE)
  2. Then learn: CALCULATE and filter context
  3. Add: Time intelligence functions
  4. Master: FILTER, ALL, ALLEXCEPT
  5. Advanced: Table functions and complex relationships

The Reality Check

DAX can get incredibly complex, but you don’t need to master everything at once. Focus on solving real problems with simple formulas first. As you get comfortable, you’ll naturally start combining functions and building more sophisticated calculations.

Most of the DAX you’ll write in real life is actually pretty straightforward – basic aggregations with some time intelligence thrown in. The complex stuff comes later when you’re building advanced analytics.

Start simple, test everything, and don’t be afraid to break things. That’s how you learn DAX for real.

Share this article
Shareable URL
Prev Post

Drill-through and Drill-down Explained in Power BI

Next Post

How to Use Power Query Editor Effectively

Leave a Reply

Your email address will not be published. Required fields are marked *

Read next