# Understanding Row Context, Table Context, and Aggregations in DAX  Calculated Columns: A Simplified Guide

When working with **DAX** (Data Analysis Expressions), one of the fundamental challenges is understanding how calculations are evaluated, especially when dealing with **row context**, **table context**, and **aggregation functions** like `SUM`, `SUMX`, and `CALCULATE`. This article will break down these concepts, explain how they work in **calculated columns**, and illustrate their differences through comprehensive examples.

---

### 1\. **Row Context and Calculated Columns**

**Row context** is inherently present in **calculated columns**. When you create a calculated column in Power BI or Excel, DAX evaluates the formula **row by row**. This means that for every row in the table, DAX has access to the values from the same row and can perform calculations specific to that row.

#### Example:

Let’s assume we have a `Sales` table like this:

| Row | Product | Quantity | Net Price |
| --- | --- | --- | --- |
| 1 | Apple | 10 | 1 |
| 2 | Banana | 20 | 2 |
| 3 | Orange | 15 | 3 |

If we create a calculated column with the formula:

```json
= Sales[Quantity] * Sales[Net Price]
```

This formula uses the **row context** to calculate the product of `Quantity` and `Net Price` for each row:

* Row 1: `10 * 1 = 10`
    
* Row 2: `20 * 2 = 40`
    
* Row 3: `15 * 3 = 45`
    

The result will be:

| Row | Product | Quantity | Net Price | Calculated Column |
| --- | --- | --- | --- | --- |
| 1 | Apple | 10 | 1 | 10 |
| 2 | Banana | 20 | 2 | 40 |
| 3 | Orange | 15 | 3 | 45 |

In this case, row context allows the calculation to happen **for each row individually**.

---

### 2\. **Table Context and Aggregation Functions**

While **row context** operates at the individual row level, **aggregation functions** like `SUM`, `AVERAGE`, and `COUNT` introduce **<mark>table context</mark>**. These functions remove row context and instead <mark>operate over the entire table or a specified subset of rows</mark>.

#### Example:

If we modify the formula to:

```json
= SUM(Sales[Quantity])
```

This will ignore the individual rows and return the **total sum of the entire** `Quantity` column for every row. Here’s what the table looks like now:

| Row | Product | Quantity | Net Price | Calculated Column (SUM) |
| --- | --- | --- | --- | --- |
| 1 | Apple | 10 | 1 | 45 |
| 2 | Banana | 20 | 2 | 45 |
| 3 | Orange | 15 | 3 | 45 |

The value **45** is the total sum of `Quantity` across the entire table (`10 + 20 + 15 = 45`), and this sum is returned for each row because the **row context is removed** by the `SUM` function.

---

### 3\. `SUMX`: Iterating Over Each Row

Unlike `SUM`, the `SUMX` function works within both row and table contexts. `SUMX` allows us to iterate over each row and perform a row-by-row calculation, after which it sums the results.

#### Example:

Now let’s look at the formula:

```json
= SUMX(Sales, Sales[Quantity] * Sales[Net Price])
```

Here’s how `SUMX` works:

1. **Row-by-row calculation**: It multiplies `Sales[Quantity]` by `Sales[Net Price]` for each row:
    
    * Row 1: `10 * 1 = 10`
        
    * Row 2: `20 * 2 = 40`
        
    * Row 3: `15 * 3 = 45`
        
2. **Summing the results**: After calculating the value for each row, `SUMX` sums the results:
    
    * `10 + 40 + 45 = 95`
        

The final result for `SUMX` will be **95**, but since this is a calculated column, it returns the **same value** for each row:

| Row | Product | Quantity | Net Price | Calculated Column (SUMX) |
| --- | --- | --- | --- | --- |
| 1 | Apple | 10 | 1 | 95 |
| 2 | Banana | 20 | 2 | 95 |
| 3 | Orange | 15 | 3 | 95 |

The **same result** (95) is returned for each row because `SUMX` is an aggregation function. Even though it iterates row by row, it aggregates the results and returns a **single total sum**.

---

### 4\. `SUMX` vs. `SUM * SUM`: <mark>Important Difference</mark>

Let’s now compare two different expressions:

* `SUMX(Sales, Sales[Quantity] * Sales[Net Price])`
    
* `SUM(Sales[Quantity]) * SUM(Sales[Net Price])`
    

#### Expression 1: `SUMX(Sales, Sales[Quantity] * Sales[Net Price])`

This formula performs a **row-by-row multiplication** of `Quantity` and `Net Price` and then sums the results, as explained earlier.

* Row-by-row calculation:
    
    * Row 1: `10 * 1 = 10`
        
    * Row 2: `20 * 2 = 40`
        
    * Row 3: `15 * 3 = 45`
        
* Final sum: `10 + 40 + 45 = 95`
    

#### Expression 2: `SUM(Sales[Quantity]) * SUM(Sales[Net Price])`

This formula **independently sums** the entire `Quantity` column and the entire `Net Price` column, and then multiply the two sums:

* `SUM(Sales[Quantity]) = 10 + 20 + 15 = 45`
    
* `SUM(Sales[Net Price]) = 1 + 2 + 3 = 6`
    

Now it multiplies the two sums:

```json
45 * 6 = 270
```

So, the final result is **270**.

| Row | Product | Quantity | Net Price | Calculated Column (`SUM * SUM`) |
| --- | --- | --- | --- | --- |
| 1 | Apple | 10 | 1 | 270 |
| 2 | Banana | 20 | 2 | 270 |
| 3 | Orange | 15 | 3 | 270 |

### Key Difference:

* `SUMX(Sales, Sales[Quantity] * Sales[Net Price])` evaluates the relationship between `Quantity` and `Net Price` row by row before summing the results, giving an accurate total based on the row-by-row calculation.
    
* `SUM(Sales[Quantity]) * SUM(Sales[Net Price])` <mark>ignores the row-by-row relationship</mark> and aggregates each column separately, which can lead to incorrect results when trying to multiply quantities and prices.
    

---

### 5\. `CALCULATE`: Changing Context

The `CALCULATE` function allows us to modify the context in which a calculation is performed. This is particularly useful when applying filters to your calculation.

#### Example:

```json
= CALCULATE(SUM(Sales[Quantity]), Sales[Country] = "USA")
```

This formula calculates the total `Sales[Quantity]` **only for rows where the** `Country` is "USA". In this case, `CALCULATE` **modifies the filter context** by restricting the calculation to specific rows.

---

### 6\. **Clarifying the Iteration Concept**

It is essential to clarify that `SUM` does not perform two iterations when used in a calculated column. Instead, it performs **a single iteration** over the entire column and returns the sum for all rows in one step. This is why you see the **same total** (e.g., `45` for `SUM(Sales[Quantity])`) repeated across all rows in a calculated column.

On the other hand, `SUMX` performs row-by-row iteration by calculating a value for each row (e.g., `Sales[Quantity] * Sales[Net Price]`), then aggregates these row-level calculations into a final total.

###   
Conclusion:

Understanding the difference between row context, table context, and aggregation functions is crucial when working with DAX. The key points to remember are:

1. **Row context** allows calculations to be performed on a row-by-row basis.
    
2. **Aggregation functions** like `SUM` operate over the entire table and remove row context.
    
3. `SUMX` combines both row and table contexts, allowing for more complex row-by-row calculations.
    
4. `SUM(Sales[Quantity]) * SUM(Sales[Net Price])` calculates the sum of each column independently, while `SUMX` evaluates the expression for each row before summing.
    
5. `CALCULATE` changes the context of a calculation, allowing for filters and more flexible expressions.
    

These distinctions are critical for building accurate DAX expressions, especially when designing calculated columns and measures in Power BI or Excel.
