Build a Sales Dashboard in Power BI

Import, model, and visualize sales data in a Power BI Desktop dashboard.

Introduction

30 Second Summary

Every sales team needs answers fast. Which products are selling best? Which regions are underperforming? Business intelligence dashboards turn raw spreadsheet data into visual stories that help leaders make decisions in seconds.

In this project, you will build an interactive sales performance dashboard in Power BI Desktop using a real-world sample dataset. You will import, clean, model, and visualize data from scratch.

What You'll Build

An executive sales report built from the AdventureWorks Sales sample dataset, featuring custom measures, a star schema data model, and interactive visualizations.

By the end of this project, you'll have:

  • A cleaned and transformed data model with proper table relationships arranged in a star schema.
  • Custom DAX measures that calculate total sales and filtered sales by product category.
  • A multi-visual report page with an area chart, map, matrix, and fiscal slicer that filter together interactively.
  • Secret Mission: Add a Year-to-Date running total measure and build a second report page comparing YTD performance across fiscal years.

Are there any prerequisites?

None. This project uses Power BI Desktop, which is a free Windows application. You do not need a Power BI Pro license or any prior experience with data analytics. The sample dataset is provided by Microsoft and downloaded during the project.

Verify Power BI Desktop and Download the Sample Data

Before you can build a dashboard, you need data to work with and a tool to shape it. Power BI Desktop is your all-in-one environment for importing, transforming, modeling, and visualizing data.

In this step, you will open Power BI Desktop, download a sample Excel workbook from Microsoft, and load its tables into the Power Query Editor for cleaning.

In this step, get ready to:
  • Confirm Power BI Desktop is installed and ready.
  • Download the AdventureWorks Sales sample Excel workbook.
  • Import all 7 tables into Power Query Editor.
Confirm Power BI Desktop is ready

Power BI Desktop is a free Windows application that does not require a paid license for local report creation. Let's confirm it opens correctly on your machine.

  • Press the Windows key to open your search bar.
  • Type Power BI Desktop and press Enter to open it.
  • If a welcome screen or sign-in dialog appears, close it by clicking the X in the top-right corner of the dialog.
  • Confirm you see the main canvas with the ribbon tabs: Home, Insert, Modeling, View.

Accept updates if prompted

If Power BI Desktop prompts you to update, accept it. Microsoft releases monthly updates and only supports the latest version.

Don't see Power BI Desktop in search?

Power BI Desktop is only available on Windows. If you cannot find it, install it from the Microsoft Store (search for "Power BI Desktop") or download it from the Microsoft Download Center.

Minimum requirements: Windows 10 or later, .NET 4.7.2 or later, 2 GB RAM (4 GB recommended), 64-bit only.

help me install Power BI Desktop on my Windows machine

Download the AdventureWorks Sales sample Excel workbook

The sample workbook contains realistic sales data across multiple tables. This is the same dataset Microsoft uses in their official Power BI tutorials.

  • Open the Microsoft Learn tutorial page in your browser.
  • Near the top of the page under the "Get data" heading, click the link that says Download the AdventureWorks Sales sample Excel workbook.
  • Save the file to a known location like your Downloads folder or Desktop.

What's inside this workbook?

The Excel workbook contains 7 tables that form a star schema dataset: Customer, Date, Product, Reseller, Sales, SalesOrder, and SalesTerritory.

Together they represent sales transactions for a fictional bicycle company, with supporting context like product categories, customer locations, and fiscal dates.

Download not starting?

If the file does not download automatically when you click the link, try right-clicking it and selecting Save link as.

help me download the AdventureWorks Sales sample Excel workbook

Import the data into Power BI Desktop

Now you will connect Power BI Desktop to the Excel workbook and load its tables into Power Query Editor for transformation.

  • In Power BI Desktop, click Get Data on the Home ribbon.
  • Select Excel Workbook from the dropdown.
  • Navigate to where you saved the AdventureWorks Sales workbook and click Open.

The Navigator pane opens, showing a list of all available tables and sheets in the workbook.

  • Select all 7 tables by checking the boxes next to: Customer, Date, Product, Reseller, Sales, SalesOrder, SalesTerritory.
  • Do NOT select any sheets labeled with a _data suffix.
  • Click Transform Data at the bottom of the Navigator pane.

Why Transform Data instead of Load?

Clicking Transform Data opens the Power Query Editor, where you can inspect and fix data types before loading into your model.

Clicking Load would skip this step and dump raw data straight into your model. Cleaning data first prevents errors in your calculations and visuals later.

Power Query Editor opens with all 7 tables listed in the Queries pane on the left side.

Not seeing all 7 tables in Power Query Editor?

Go back to the Navigator step by closing Power Query Editor and clicking Get Data again. Make sure you checked the individual table names (Customer, Date, Product, Reseller, Sales, SalesOrder, SalesTerritory) and not the sheet entries that end in _data.

help me select the correct tables in the Power BI Navigator pane

Your data is loaded and ready for cleaning. Next up, you will verify and fix data types to make sure Power BI can calculate correctly with your numbers and dates.

Transform and Clean the Data with Power Query

In the previous step, you imported seven tables from the AdventureWorks Sales workbook into Power Query Editor. The data is loaded, but it is not yet trustworthy.

When Power BI imports data from Excel, it guesses each column's data type. Sometimes it guesses wrong. A sales amount stored as text instead of a number means your calculations will silently break. In this step, you will verify and correct data types so every future measure returns accurate results.

In this step, get ready to:
  • Verify and fix data types across the Sales, Date, Product, and Reseller tables.
  • Apply changes and load the cleaned data into the Power BI data model.
Verify and fix data types

Power BI needs to know whether a column holds numbers, dates, or text. Incorrect types cause silent calculation errors that are hard to trace later.

  • In the Power Query Editor, select the Sales query from the Queries pane on the left.
  • Look at the column headers. Each header shows a small icon indicating the current data type (ABC for text, 1.2 for decimal, 123 for whole number, calendar for date).
  • Confirm that Sales Amount shows as Decimal Number and Order Quantity shows as Whole Number.

To auto-detect all column types at once:

  • Select all columns by pressing Ctrl+A.
  • Go to the Transform tab in the ribbon.
  • Select Detect Data Type.

What does Detect Data Type do?

Power Query scans the values in each selected column and assigns the most appropriate type (Decimal Number, Whole Number, Date, Text, etc.). This is faster than changing each column manually.

Now repeat this process for the other key tables. Select each table from the Queries pane, then verify these specific column types:

  • Select the Date table. Verify: DateKey = Whole Number, Date = Date type, MonthKey = Whole Number.
  • Select the Product table. Verify: ProductKey = Whole Number, Standard Cost = Decimal Number, List Price = Decimal Number.
  • Select the Reseller table. Run Detect Data Type (Ctrl+A, then Transform tab, then Detect Data Type) to confirm its columns are typed correctly.

Fix a single column manually

If a specific column shows the wrong type after auto-detection, click the type icon in the column header. A dropdown appears where you can pick the correct type (e.g., Decimal Number or Whole Number).

Columns still showing ABC (text) after detection?

Make sure you selected all columns with Ctrl+A before running Detect Data Type. If only one column was selected, only that column was updated.

If a column like Sales Amount still shows as text, click its header icon and manually choose Decimal Number. Power Query may ask whether to replace the existing type step. Select Replace current.

Help me fix data types in Power Query

Apply changes and load the data model

With all data types confirmed, it is time to push the cleaned data from Power Query into the Power BI data model where you can build relationships and write measures.

  • Select the Home tab in the Power Query Editor ribbon.
  • Click Close & Apply on the left side of the ribbon.
  • Wait for the loading indicator to finish. Power BI is importing all seven tables with your corrected data types.

What does Close and Apply do?

Close and Apply saves all transformations you made in Power Query Editor and loads the resulting data into Power BI's internal data model. You return to the main report canvas, where the data is now ready for relationships and visualizations.

Once loading completes, you should see the report canvas. The Fields pane on the right side now lists all 7 tables with expandable columns.

Don't see the Fields pane?

Make sure you are in Report View (the chart icon at the top of the left-side menu). The Fields pane only appears in Report View and Data View.

If the pane is collapsed, go to the View tab in the ribbon and check that Fields is enabled.

Help me find the Fields pane in Power BI Desktop

Your data is now cleaned and loaded. Next up, you will arrange these tables into a star schema so Power BI knows how they connect to each other.

Build the Star Schema Data Model

Your data is cleaned and loaded. Now you need to tell Power BI how the tables connect to each other so it can filter and aggregate correctly across all seven tables.

In this step, you will arrange your tables into a star schema. This is a pattern where a central fact table (Sales) connects outward to dimension tables (Date, Product, Customer, Reseller, SalesTerritory). The star shape lets Power BI filter your sales data by any dimension.

In this step, get ready to:
  • Create table relationships between all dimension tables and the Sales fact table.
  • Hide key columns that clutter the Fields pane.
  • Create a Fiscal hierarchy in the Date table for drill-down analysis.
Create table relationships

Relationships are what allow Power BI to filter one table based on values in another. Without them, your visuals would show totals with no way to break them down by date, product, or customer.

  • Select Model View from the left-side menu (the icon with connected boxes).
  • You should see all seven tables displayed as cards in the diagram.

What is Model View?

Model View shows all of the tables, columns, and relationships in your data model as a visual diagram. You can create and edit relationships here by dragging columns between tables.

Some relationships may already be auto-detected by Power BI. You will now manually create the key relationships between the Date table and the Sales table.

  • Drag DateKey from the Date table and drop it onto OrderDateKey on the Sales table.
  • A continuous line appears between the two tables, showing a one-to-many relationship (indicated by 1 and * at each end).

Why one-to-many?

Each date in the Date table can appear on many sales orders, but each sales order has exactly one order date. This one-to-many pattern is how dimension tables relate to fact tables in a star schema.

  • Drag DateKey from the Date table to DueDateKey on the Sales table.
  • Drag DateKey from the Date table to ShipDateKey on the Sales table.

These two new relationships appear as dashed lines. They are inactive because Power BI only allows one active filter path between two tables at a time.

Active vs. inactive relationships

The first relationship you created (on OrderDateKey) is active, shown by the continuous line. Power BI uses this by default when calculating totals by date.

The inactive relationships (dashed lines) on DueDateKey and ShipDateKey can be activated later using the USERELATIONSHIP DAX function when you want to analyze by due date or ship date.

  • Verify the remaining relationships exist by checking the lines between tables. You should see connections for:

Missing a relationship line?

If a relationship between Product, Customer, Reseller, or SalesTerritory and Sales does not appear automatically, create it manually. Drag the matching Key column from the dimension table onto the corresponding Key column in the Sales table.

Help me create a missing relationship in Model View.

Hide key columns from report view

Key columns (like CustomerKey and ProductKey) are used only for relationships. Showing them in your report would confuse anyone reading the dashboard because they are numeric IDs with no business meaning.

  • In Model View, right-click CustomerKey in the Customer table and select Hide in report view.
  • Repeat for CustomerKey in the Sales table.
  • Hide the following columns using the same method:

Hidden columns show an eye-with-line icon in Model View. They still work for relationships but won't appear when you build visuals.

Speed up hiding columns

You can hold Ctrl, click multiple columns in a table, then right-click and select Hide in report view to hide them all at once.

Create a hierarchy in the Date table

Hierarchies let you drill down through levels of detail in a visual. A Fiscal hierarchy lets you start at the year level and drill into quarters, months, and individual dates.

  • In Model View, right-click the Year column in the Date table.
  • Select Create hierarchy.
  • Name the hierarchy Fiscal.
  • Drag Quarter into the hierarchy as the next level below Year.
  • Drag Month into the hierarchy below Quarter.
  • Drag Date into the hierarchy below Month.
  • Select Apply Level Changes in the Properties pane to confirm.

What does the Fiscal hierarchy do?

When you later add this hierarchy to a chart, Power BI gives you drill-down buttons. You can start at the yearly view and click down into quarters, then months, then individual dates. This makes it easy for stakeholders to explore trends at different levels of detail.

Your Model View should now show a clear star shape. Sales sits at the center with lines radiating out to each dimension table. Key columns are hidden, and the Date table contains a Fiscal hierarchy.

Don't see the star shape?

If your tables overlap or the layout looks cluttered, drag the table cards around in Model View to arrange them with Sales in the middle and the dimension tables around it. The layout is cosmetic and does not affect functionality.

Help me verify my star schema relationships are correct.

Your data model is structured and ready. Next up, you will write DAX measures that calculate totals and filtered aggregations on top of this star schema.

Write DAX Measures

Your star schema is in place, with Sales at the center connected to all dimension tables. The next step is turning that raw data into meaningful business metrics.

DAX (Data Analysis Expressions) is Power BI's formula language for creating custom calculations. In this step, you'll write three measures that answer specific business questions about sales performance.

In this step, get ready to:
  • Create a Total Sales measure using SUM.
  • Create a filtered Bikes Sales measure using CALCULATE.
  • Create a Sales Amount by Due Date measure using USERELATIONSHIP.
Create a Total Sales measure

Measures are DAX formulas that calculate values dynamically based on the filters applied to your report. Unlike columns, measures don't store data. They compute results on the fly when you use them in a visual.

  • Switch to Table View by clicking the table icon on the left menu.
  • In the Fields pane on the right, select the Sales table.
  • On the Home ribbon, click New Measure.
  • In the formula bar that appears at the top of the canvas, type this DAX formula:
Total Sales = SUM(Sales[Sales Amount])
  • Press Enter or click the checkmark to commit the measure.

What does this formula do?

SUM(Sales[Sales Amount]) adds up every value in the Sales Amount column across the entire Sales table.

The name Total Sales before the equals sign is what appears in your Fields pane. When you drag this measure into a visual, Power BI recalculates the sum based on whatever filters are active.

You should see Total Sales appear in the Fields pane under the Sales table with a small calculator icon next to it.

Don't see the measure in the Fields pane?

Make sure you selected the Sales table before clicking New Measure. If you didn't select a table first, the measure may have been created in an unexpected table.

Also check that you pressed Enter or clicked the checkmark after typing the formula. If the formula bar still shows your text, the measure hasn't been committed yet.

My measure isn't showing up in the Sales table.

Create a filtered measure using CALCULATE

CALCULATE is the most important DAX function for data analysts. It evaluates an expression in a modified filter context, letting you override or add filters programmatically.

  • With the Sales table still selected, click New Measure on the Home ribbon.
  • Type this formula in the formula bar:
Bikes Sales = CALCULATE(SUM(Sales[Sales Amount]), Product[Category] = "Bikes")
  • Press Enter to commit the measure.

What does CALCULATE do here?

CALCULATE takes two arguments in this formula. The first is the expression to evaluate: SUM(Sales[Sales Amount]). The second is the filter to apply: Product[Category] = "Bikes".

The result is a sum of Sales Amount, but only for rows where the product category is Bikes. No matter what slicers or filters the report user applies, this measure always restricts to Bikes.

Why CALCULATE over Quick Measures?

Power BI offers Quick Measures that auto-generate DAX for you. Writing the formula manually builds the muscle memory you need for interviews and real-world reporting.

CALCULATE is the single most common function in professional DAX. Understanding how it modifies filter context separates analysts who build reports from analysts who can only consume them.

You should see Bikes Sales appear under the Sales table in the Fields pane with a calculator icon.

Create a Sales Amount by Due Date measure using USERELATIONSHIP

Your model has three relationships between Sales and Date (order date, due date, ship date). Only one can be active at a time. USERELATIONSHIP lets a measure temporarily activate an inactive relationship for its calculation.

  • Click New Measure on the Home ribbon.
  • Type this formula in the formula bar:
Sales Amount by Due Date = CALCULATE(SUM(Sales[Sales Amount]), USERELATIONSHIP(Sales[DueDateKey],'Date'[DateKey]))
  • Press Enter to commit the measure.

What does USERELATIONSHIP do?

USERELATIONSHIP(Sales[DueDateKey],'Date'[DateKey]) tells Power BI to use the inactive relationship (the dashed line you saw in Model View) instead of the default active one.

This lets you analyze when orders were due rather than when they were placed. The active relationship still handles all other visuals. Only this measure switches to the due-date path.

You should see Sales Amount by Due Date appear in the Fields pane under Sales, bringing your total to three measures with calculator icons.

Seeing a formula error?

Check for matching parentheses. The USERELATIONSHIP formula has nested parentheses that are easy to miscount.

Make sure column names match exactly. Sales[DueDateKey] and 'Date'[DateKey] must use the correct table and column names from your model. The single quotes around 'Date' are required because Date is a reserved word in DAX.

My DAX formula is returning an error and I'm not sure what's wrong.

✔️ Awesome, I've got everything!

Great. Confirm you've saved your work by pressing Ctrl+S.

ⓧ I'd like to double check all three measures

Here are all three DAX measures you should have in the Sales table:

Total Sales = SUM(Sales[Sales Amount])
Bikes Sales = CALCULATE(SUM(Sales[Sales Amount]), Product[Category] = "Bikes")
Sales Amount by Due Date = CALCULATE(SUM(Sales[Sales Amount]), USERELATIONSHIP(Sales[DueDateKey],'Date'[DateKey]))

Each measure should appear in the Fields pane under the Sales table with a calculator icon. If any are missing, select the Sales table and create the measure again using New Measure on the Home ribbon.

Your measures are ready to power real visuals. Next up, you'll build an interactive report page with charts, maps, and slicers that bring these calculations to life.

Build the Interactive Report

Your data model is complete and your DAX measures are ready to calculate. Now it is time to turn all that preparation into something visual.

Report View is where you drag fields onto a canvas and Power BI renders them as interactive charts, maps, and tables. By the end of this step you will have a polished one-page executive summary that answers real business questions at a glance.

In this step, get ready to:
  • Create an area chart showing monthly sales performance.
  • Add a map and a matrix visual for geographic and category breakdowns.
  • Insert a slicer and title to make the report interactive and presentation-ready.
Create a Sales Amount by Month area chart

The first visual answers the question: which months generate the most revenue? An area chart makes trends over time easy to spot.

  • Switch to Report View by clicking the chart icon in the left-side menu.
  • In the Fields pane on the right, expand the Sales table.
  • Drag Sales Amount onto the blank canvas.

A default column chart appears on the canvas.

  • In the Fields pane, expand the Date table, then expand the Fiscal hierarchy.
  • Drag Month and drop it onto the chart's X-axis area.
  • In the Visualizations pane, click the Area Chart icon to change the chart type.

What does this chart show?

The area chart plots total Sales Amount across each month. The filled area makes it easy to see seasonal peaks and troughs in revenue.

Because Month comes from your Fiscal hierarchy, you can drill up to Year or down to individual dates using the drill buttons that appear at the top of the visual.

Compare order date vs. due date

You can optionally drag the Sales Amount by Due Date measure to the Y-axis well alongside Sales Amount. This shows when revenue was due vs. when orders were placed.

Your canvas now has one visual. You should see a filled area chart with months along the bottom and sales values on the left axis.

Chart showing a single bar instead of months?

Make sure you dragged Month from the Fiscal hierarchy (inside the Date table), not a different Month field. If the chart still shows a single bar, click the chart and check the X-axis well in the Visualizations pane to confirm Month is listed there.

Help me fix my area chart

Create a map and a matrix visual

The map answers which countries drive the most orders. The matrix breaks down sales by product category and reseller business type.

  • Click a blank area of the canvas so no existing visual is selected.
  • In the Fields pane, expand the Reseller table.
  • Drag Country-Region onto a blank area of the canvas.

A map visual appears automatically.

  • Expand the Sales table in the Fields pane.
  • Drag Order Quantity and drop it into the Bubble size well in the Visualizations pane.

What does the map show?

Each bubble represents a country where resellers operate. Larger bubbles mean more orders placed through resellers in that country.

Now create the matrix visual.

  • Click a blank area of the canvas again.
  • In the Fields pane, check Sales Amount from the Sales table.
  • Check Category from the Product table.
  • Check Business Type from the Reseller table.
  • In the Visualizations pane, click the Matrix icon to change the visual type.
  • In the Visualizations pane, drag Business Type from the Columns well down to the Rows well, placing it below Category.

What does the matrix show?

The matrix displays sales broken down by product category and reseller business type. This lets you see which product lines perform best through each sales channel.

Your canvas now has three visuals: an area chart, a map, and a matrix.

Map showing a blank globe?

Power BI needs to geocode the Country-Region values. Make sure you dragged Country-Region from the Reseller table (not a different field). If bubbles still do not appear, check that Order Quantity is in the Bubble size well.

Help me fix my map visual

Add a Fiscal slicer and format the report

A slicer is a visual filter control that lets viewers narrow the entire report to specific time periods. Adding one gives your report interactivity without requiring viewers to use the Filters pane.

  • In the Fields pane, expand the Date table.
  • Drag the Fiscal hierarchy to a blank area on the left side of the canvas.
  • In the Visualizations pane, click the Slicer icon to change the visual type.
  • In the slicer's field well, remove Quarter and Date so only Year and Month remain.

Why remove Quarter and Date?

Keeping only Year and Month gives viewers a clean two-level filter. They can pick a fiscal year to see the full year, or expand into individual months for detail.

Now add a title and save your report.

  • On the Insert ribbon at the top, click Text Box.
  • Type Executive Summary - Sales Report into the text box.
  • Highlight the text, set the font size to 20, and click Bold.
  • Position the text box at the top of the canvas.
  • Save the report by clicking File, then Save As.
  • Name the file AdventureWorks Sales Report and click Save.

Your report is complete. Test the interactivity by clicking a year value in the slicer.

What should I see?

You should have four or more visuals on a single page: an area chart, a map with sized bubbles, a matrix table, and a slicer on the left. A bold title sits at the top.

Clicking a year in the slicer filters all visuals simultaneously. Hover over any data point to see a tooltip with exact values.

Slicer not filtering other visuals?

Make sure the slicer uses the Fiscal hierarchy from the Date table. If you accidentally used a field from another table, the slicer will not have relationships to filter the Sales data.

Also confirm that your Date-to-Sales relationship on OrderDateKey is active (solid line) in Model View.

Help me fix my slicer filtering

Secret mission

Add Year-to-Date Analysis with TOTALYTD

Your dashboard shows monthly sales, but stakeholders often want to see cumulative performance over time. Can you add a Year-to-Date running total and build a second report page that compares YTD performance across fiscal years?

Clean Up Your Resources

Clean Up Your Resources

This project runs entirely locally in Power BI Desktop, so there are no ongoing costs or cloud resources to worry about. Decide whether to keep your files for future reference or delete them.

Resources you used:

  • AdventureWorks Sales Report.pbix (your completed Power BI report file).
  • AdventureWorks Sales Excel workbook (the downloaded sample dataset).

Keep everything running

No action needed. Choose this if you plan to keep exploring the report, adding more visuals, or using it as a portfolio piece.

  • Your AdventureWorks Sales Report.pbix file stays wherever you saved it.
  • The downloaded Excel workbook stays in your Downloads folder or Desktop.

Pause - I'll come back to this later

Since everything is local files, there is nothing to pause. Your report and data will be ready whenever you reopen them in Power BI Desktop.

  • Make a note of where you saved AdventureWorks Sales Report.pbix so you can find it later.
  • Keep the Excel workbook in the same location. Power BI may reference it if you refresh data.

Delete - I don't want to use this again

Remove all project files from your machine. This frees up disk space and clears the project entirely.

  • Delete AdventureWorks Sales Report.pbix. Navigate to the folder where you saved it, right-click the file, and select Delete.
  • Delete the AdventureWorks Sales Excel workbook. Navigate to your Downloads folder (or Desktop), right-click the file, and select Delete.
  • Empty your Recycle Bin to permanently remove the files.

Nice Work!

Nice Work!

You just built a complete interactive sales dashboard in Power BI Desktop from scratch. Starting with raw Excel data, you took it through the full BI pipeline and produced a report ready for stakeholder review.

You've learned how to:

  • Import and transform raw data using Power Query, then build a star schema data model with proper one-to-many relationships between fact and dimension tables.
  • Write DAX measures using SUM, CALCULATE with filter context, and USERELATIONSHIP to activate inactive relationships for date-based analysis.
  • Design a multi-visual interactive report with an area chart, map, matrix, and fiscal slicer that filters all visuals simultaneously.
  • Secret Mission: Added time intelligence with TOTALYTD and built a second report page comparing year-to-date performance across fiscal years.

Ready to quiz yourself?