What are Semi-Additive Measures in Power BI?

Cody Schneider9 min read

Building reports can feel straightforward until you run into a metric that just won't add up correctly. You can sum daily sales to get a monthly total, but if you try the same with your daily inventory count, the result is completely wrong. This is where semi-additive measures come in, providing a clean solution for handling data that shouldn't be added up over time. This article will show you exactly what semi-additive measures are and how to build them in Power BI using DAX.

What Does "Additive" Even Mean?

In business intelligence, measures typically fall into one of three categories based on how they can be aggregated or "summed up" across different dimensions like time, region, or product category.

1. Additive Measures

These are the simplest and most common type of measure. An additive measure can be summed across any and all dimensions in your data model, and the result will always make sense. Sales is the classic example.

  • You can add up sales across all days in a month to get a monthly total.
  • You can add up sales from all regions to get a national total.
  • You can add up the monthly totals for all regions, and the result is the same as adding up the national totals across all months.

Other examples include Quantity Sold, Website Visits, or Marketing Cost. No matter how you slice them, simple addition works perfectly.

2. Non-Additive Measures

A non-additive measure cannot be meaningfully summed across any dimension. These are often ratios or percentages. For example, Profit Margin %.

If Store A has a 10% profit margin and Store B has a 15% profit margin, the total profit margin for the company is not 25% (10% + 15%). To get the overall margin, you must recalculate it from the base components: (Total Profit) / (Total Revenue). You can't just add up the percentages. Other examples include average temperatures or unit prices.

3. Semi-Additive Measures

This is the tricky category that sits between the first two. A semi-additive measure can be summed across some dimensions but not others. Almost always, the dimension that "breaks" the summation is time.

These measures represent a snapshot or a balance at a specific point in time. Things like:

  • Inventory levels: The stock count at the end of the day.
  • Account balances: How much money is in a bank account on a given date.
  • Employee headcount: The number of employees on the company roster at month-end.

You can add your inventory counts across different warehouses to get a total company inventory, and that works fine (additive by location). However, you cannot add the inventory count from Monday to the count from Tuesday to get a total for those two days.

The Classic Semi-Additive Problem: Inventory and Account Balances

Let's use a clear example to see why the default SUM behavior in Power BI fails for semi-additive metrics. Imagine you run an e-commerce store and you record your inventory of a specific product every day for a week.

Your data looks like this:

  • Monday: 100 units
  • Tuesday: 95 units (you sold 5)
  • Wednesday: 90 units (you sold 5 more)
  • Thursday: 140 units (a new shipment arrived)
  • Friday: 130 units (a good sales day)

If you build a simple report in Power BI and put "Date" and "UnitsInStock" into a table, the software will want to helpfully provide a total. By default, it will use SUM(). The result would be:

Total Inventory = 100 + 95 + 90 + 140 + 130 = 555 units

What does "555 units" represent? Nothing. It's a completely meaningless number for business analysis. What you actually want to know is the stock level at the end of the period. In this case, your closing inventory for the week is 130 units - the value from Friday.

The same logic applies to a bank account balance. Your balance at the end of the month is not the sum of your balances from every single day of that month. It's the balance as of the very last day.

To solve this, we cannot rely on default aggregations. We need to write a little bit of DAX (Data Analysis Expressions) to tell Power BI exactly how to calculate these values across time periods.

How to Create Semi-Additive Measures in Power BI with DAX

DAX is the formula language used in Power BI, and it's perfectly equipped to handle semi-additive logic. The key is to use specific functions that can override the default filters and calculations for time periods.

Calculating the Last Value in a Period (Closing Balances)

The most common need for a semi-additive measure is to get the "closing balance" or the last known value in a given time period (day, month, quarter, or year). The best DAX pattern for this uses the CALCULATE and LASTDATE functions.

Imagine you have a table named Inventory with a UnitsInStock column and a separate Date table. Your DAX measure would look like this:

Ending Inventory =
CALCULATE (
    SUM ( 'Inventory'[UnitsInStock] ),
    LASTDATE ( 'Date'[Date] )
)

Let's break down what's happening here:

  • The SUM( 'Inventory'[UnitsInStock] ) part might look wrong - "But we don't want to sum it!" Correct, but here's the trick: when evaluating a single day, the SUM of one number is just that number. We need an aggregate function inside CALCULATE.
  • The CALCULATE() function is the most powerful in DAX. It modifies the "filter context" of a calculation. We are telling it to perform the SUM, but only after applying a new filter.
  • LASTDATE( 'Date'[Date] ) is that new filter. It tells CALCULATE to ignore the current date context and instead only look at the single, very last date within the chosen period.

When you drop this measure into a report that's sliced by month, for each month it will find the last date with data for that month and return the corresponding stock value - exactly what we want!

Finding Opening Balances and Other Snapshot Values

Once you understand the LASTDATE pattern, creating other point-in-time measures is simple. To find the "opening balance," you just swap LASTDATE with FIRSTDATE.

Opening Inventory =
CALCULATE (
    SUM ( 'Inventory'[UnitsInStock] ),
    FIRSTDATE ( 'Date'[Date] )
)

This works the same way but finds the stock value from the very first day of the relevant period.

An Easier Approach: Built-in Time Intelligence Functions

For standard calendar-based closing balances, DAX provides a set of helpful shortcut functions. These achieve the same result as the CALCULATE pattern above but with slightly cleaner code.

A few of the most useful "closing balance" functions are:

  • CLOSINGBALANCEMONTH()
  • CLOSINGBALANCEQUARTER()
  • CLOSINGBALANCEYEAR()

Here’s how you would write the ending inventory measure using one of these functions:

Ending Inventory Month =
CLOSINGBALANCEMONTH(
    SUM('Inventory'[UnitsInStock]),
    'Date'[Date]
)

This measure specifically finds the inventory level on the last day of each month. It’s less flexible than the CALCULATE pattern (which automatically adapts to months, quarters, and years depending on your visual), but it's very readable and great for specific monthly or quarterly reports.

Best Practices to Keep in Mind

When you start building semi-additive measures, following a few best practices will save you from common headaches.

1. Always Use a Dedicated Date Table

Time intelligence functions in DAX - including LASTDATE, FIRSTDATE, and CLOSINGBALANCEMONTH - require a proper date table. This table must have a column of the "date" data type with one row for every day in the periods you need to analyze, without any gaps. You should mark this table as a "date table" in Power BI's model view. This is non-negotiable for stable time-based calculations.

2. Create Base Measures First

Instead of typing SUM('Inventory'[UnitsInStock]) repeatedly, it's a better practice to create a simple, explicit base measure first.

Base Measure:

Inventory Stock Level = SUM('Inventory'[UnitsInStock])

This is an additive measure, and its results will be incorrect over time periods, but that's okay. We won't use it directly in our summed totals. Now we use it as a building block for our semi-additive measures:

Semi-Additive Measure:

Ending Inventory =
CALCULATE(
    [Inventory Stock Level],
    LASTDATE('Date'[Date])
)

This makes your DAX cleaner, easier to read, and much simpler to debug if something goes wrong. If you need to change the fundamental calculation, you only have to do it in one place.

3. Understand Filter Context

Remember that the output of any DAX measure depends entirely on its context - the combination of filters coming from the visual (like rows or axes in a chart), slicers on the page, and other filter settings. Your Ending Inventory measure will correctly show the last value for a month, a year, or even a single week, depending on how you've set up your visual.

4. Name Your Measures Clearly

Don't just name your measure "Inventory." Is it the moving sum? The opening balance? The closing final figure? Be specific. Names like EOM Inventory (End of Month Inventory), Closing Balance, or Employee Headcount (EOP) (End of Period) make it clear to anyone using the report what that number represents.

Final Thoughts

Semi-additive measures are the solution for properly reporting on crucial business metrics like inventory, account finances, and headcounts. While a regular SUM gives meaningless results over time, you can use simple DAX functions like CALCULATE with LASTDATE or dedicated time intelligence functions like CLOSINGBALANCEMONTH to get the correct point-in-time value every time.

Building these reports from scratch gives you precise control, but it also reveals how much specialized knowledge analytics often requires. We built Graphed to remove these barriers. Instead of wrestling with data models or learning DAX formulas, you simply connect your data sources and ask questions in plain English. For example, you could ask, "Show me my closing inventory values by warehouse for last quarter," and our AI will build a live, interactive dashboard for you in seconds. It handles the complexities of semi-additive logic behind the scenes, turning hours of report building into a quick conversation.

Related Articles

How to Connect Facebook to Google Data Studio: The Complete Guide for 2026

Connecting Facebook Ads to Google Data Studio (now called Looker Studio) has become essential for digital marketers who want to create comprehensive, visually appealing reports that go beyond the basic analytics provided by Facebook's native Ads Manager. If you're struggling with fragmented reporting across multiple platforms or spending too much time manually exporting data, this guide will show you exactly how to streamline your Facebook advertising analytics.

Appsflyer vs Mixpanel​: Complete 2026 Comparison Guide

The difference between AppsFlyer and Mixpanel isn't just about features—it's about understanding two fundamentally different approaches to data that can make or break your growth strategy. One tracks how users find you, the other reveals what they do once they arrive. Most companies need insights from both worlds, but knowing where to start can save you months of implementation headaches and thousands in wasted budget.