Power BI · Beginner

Power BI Desktop tutorial for beginners

14 min read

Why it matters

This Power BI tutorial for beginners gets you from an empty screen to a first report on real data, and teaches the habits that separate a report people trust from a pretty one. Power BI was named in 80% of the 50 Data Analyst job descriptions we analysed for the Data Analyst roadmap (90% of the junior ones), second only to SQL. Interviewers assume you can find your way around Desktop on day one; what they test is whether you notice when a number on your own report is wrong.

The concept

Power BI is two products that work together:

Power BI DesktopPower BI service (app.powerbi.com)
What it isA free Windows applicationA website (part of Microsoft Fabric)
What you do thereConnect to data, clean it (Power Query), build the model, write DAX, design report pagesPublish, share, schedule refresh, set security, build apps and dashboards
File.pbix or a .pbip project folderWorkspaces holding semantic models and reports
CostFreeFree for your own use; sharing needs a paid licence (table below)

You build in Desktop and share through the service. Everything in the Beginner and Intermediate lessons of this skill happens in Desktop.

Installing Power BI Desktop

Power BI Desktop runs on 64-bit Windows 10 and 11 only. You have two ways to install it:

  • Microsoft Store (search "Power BI Desktop"). Updates arrive automatically every month, and you need no admin rights. This is the right choice for a personal laptop.

  • Download Center installer (PBIDesktopSetup_x64.exe from the Microsoft download page). You update it yourself. Companies use it when the Store is blocked or when everyone must stay on the same version.

There is also a separate build called Power BI Desktop for Report Server, used only by companies that host reports on their own servers with Power BI Report Server. If your employer uses Report Server, install the build that matches their server version, otherwise reports you save may not open there.

The four views

The icons on the left edge of Desktop switch between views:

ViewWhat it is for
ReportThe canvas where you place visuals on pages. This is what your users see.
Table (called Data view in older versions)Look at the rows of a loaded table, check values after a refresh, add calculated columns.
ModelTables as boxes with relationship lines. You set relationships, column properties, hide columns, organise measures.
DAX queryWrite and run EVALUATE queries against your model to test measures, like a SQL console.

Recent versions also show a TMDL view that displays the model as text; you meet it in the deployment lesson. Power Query has its own window, the Power Query editor, opened with Home, Transform data.

Get data, the Navigator, Load vs Transform data

Home, Get data lists more than a hundred connectors (Excel, Text/CSV, Web, Folder, SQL Server, PostgreSQL, SharePoint and many more). After you point it at a source, the Navigator (or a preview window for a single file) shows a sample of the data and two buttons:

  • Load imports the data as it is, with the column types Power BI guessed.

  • Transform data opens the Power Query editor first, so you can fix types, remove columns and filter rows before anything reaches the model.

Choose Transform data almost every time. Data that is cleaned before it loads is smaller, faster and correct; fixing it later in DAX is slower and harder to maintain.

The panes in Report view

PaneWhereWhat it does
Data (called Fields in older versions and most tutorials)Right edgeLists tables, columns and measures. Drag fields from here onto visuals.
VisualizationsLeft of the Data panePick a visual type; the Build visual tab has the field wells (X-axis, Y-axis, Legend, Values); the Format visual tab (paintbrush icon) holds colours, titles, labels.
FiltersCollapsible, left of VisualizationsFilters on this visual, on this page, or on all pages.
FormatInside VisualizationsFormatting for the selected visual, or the page when nothing is selected.

The View ribbon tab turns on extra panes you will use later: Bookmarks, Selection, Sync slicers and Performance analyzer.

Implicit measures and why you stop using them

Drag a numeric column such as Quantity into a visual and Power BI adds it up for you. The field well shows Sum of Quantity. This is an implicit measure: a calculation Power BI creates behind the scenes from the column's Summarization property (Sum by default for numbers).

Implicit measures are fine for a five-minute look, but they cause real problems:

  • Any numeric column gets summed, including IDs, years and prices. Sum of CustomerID is a number with no meaning.

  • They cannot be reused in other measures, cannot hold a description, and cannot be given a consistent format across the report.

  • Excel users who connect with Analyze in Excel cannot use them, and once you add a calculation group to the model (an advanced lesson) implicit measures stop working entirely.

An explicit measure is one you write in DAX: Home, New measure, then Total Revenue = SUM ( Retail[Revenue] ). From the next lesson on, every number on a report page comes from an explicit measure. For columns that should never be summed (IDs, years, codes), set Column tools, Summarization, Don't summarize, or better, make ID columns text.

Options to change on day one

Open File, Options and settings, Options:

  • Current File, Data Load: untick Auto date/time. When it is on, Power BI creates a hidden date table for every date column in the model. These hidden tables bloat the file and get in the way of the proper date table you will build later in this module. Also untick it under Global, Data Load so new files start without it.

  • Global, Regional Settings. Check the locale used for import. A day-first locale such as English (India) reads 12/1/2010 as 12 January, which matters for US-format files like the one below. The next lesson shows how to fix this per column.

  • Global, Preview features. New features arrive here first, ticked off. Turn on only what you need and remember that a colleague without the same preview may not be able to open your file the same way.

File formats: .pbix, .pbip and .pbit

  • .pbix is a single file that holds the queries, the imported data, the model and the report. Easy to email, impossible to diff in Git.

  • .pbip (Power BI project) saves the same content as a folder of text files: the model in TMDL and the report definition in JSON. Teams use it with Git; you meet it in the deployment lesson. Depending on your Desktop version it may need turning on under Preview features.

  • .pbit is a template: queries, model and report without the data.

Desktop has no undo history across saves. Keep your work in a OneDrive or SharePoint folder (both keep version history) or in Git, and save a dated copy before any big change.

Licences: who can share what

LicencePrice (Microsoft's US list price, paid yearly)What it lets you do
Free0Use Desktop; publish to your own My workspace; cannot share with anyone
Pro$14.00 per user per monthPublish to shared workspaces and share with other Pro users; 1 GB per semantic model, 8 scheduled refreshes a day
Premium Per User (PPU)$24.00 per user per monthPro features plus most Premium features (100 GB models, 48 refreshes a day); viewers also need PPU
Fabric capacity F64 or larger (or a Premium P capacity)Per capacity, not per userFree-licence users can view content in workspaces on that capacity; authors still need Pro or PPU

Prices are from Microsoft's Power BI pricing page as of October 2026 and vary by country and agreement. As a fresher you will use your employer's licence; for practice, Desktop is free and the service offers a trial.

Worked example: your first report on 541,909 retail transactions

You will use the Online Retail dataset from the UCI Machine Learning Repository (CC BY 4.0, dataset page): every invoice line of a UK online gift retailer from 1 December 2010 to 9 December 2011. Its rows are the same as the "Year 2010-2011" sheet of the larger Online Retail II dataset. A CSV copy sits on GitHub in the Databricks Spark: The Definitive Guide repository, so Power BI can read it straight from a URL:

data-url.txt
https://raw.githubusercontent.com/databricks/Spark-The-Definitive-Guide/master/data/retail-data/all/online-retail-dataset.csv

Step 1: load the file

  1. Home, Get data, Web, paste the URL, OK. Power BI detects a CSV and shows a preview with columns InvoiceNo, StockCode, Description, Quantity, InvoiceDate, UnitPrice, CustomerID, Country.

  2. Click Transform data.

  3. In Power Query, rename the query (right pane, Name) to Retail.

  4. Add Column, Custom column, name it Revenue, formula [Quantity] * [UnitPrice]. Set its type to Decimal number with the type icon in the column header.

  5. Home, Close & Apply. The rows load into the model.

The query Power Query writes for you looks like this (open Home, Advanced editor to see it):

Retail.pq
let
    Source = Csv.Document(
        Web.Contents("https://raw.githubusercontent.com/databricks/Spark-The-Definitive-Guide/master/data/retail-data/all/online-retail-dataset.csv"),
        [Delimiter = ",", Columns = 8, Encoding = 65001, QuoteStyle = QuoteStyle.Csv]
    ),
    #"Promoted Headers" = Table.PromoteHeaders(Source, [PromoteAllScalars = true]),
    #"Changed Type" = Table.TransformColumnTypes(
        #"Promoted Headers",
        {
            {"InvoiceNo", type text}, {"StockCode", type text}, {"Description", type text},
            {"Quantity", Int64.Type}, {"InvoiceDate", type datetime}, {"UnitPrice", type number},
            {"CustomerID", Int64.Type}, {"Country", type text}
        }
    ),
    #"Added Revenue" = Table.AddColumn(#"Changed Type", "Revenue", each [Quantity] * [UnitPrice], type number)
in
    #"Added Revenue"

Your #"Changed Type" step may differ: Power BI guesses types from the first 200 rows, and if your Regional Settings locale is day-first the InvoiceDate guess can go wrong. You will fix both properly in the next lesson. Notice that Power BI guessed CustomerID as a whole number. Keep that in mind.

Step 2: three visuals

  1. A card. Pick the Card visual, then Home, New measure:

    Total
    Total Revenue = SUM ( Retail[Revenue] )

    Drag Total Revenue into the card's Fields well.

  2. A bar chart of revenue by country. Clustered bar chart, Country on the Y-axis, Total Revenue on the X-axis. Sort it descending by Total Revenue (the ... menu on the visual, Sort axis).

  3. A line chart by month. With Auto date/time off, a datetime column on the X-axis gives one point per timestamp, which is unreadable. Go back to Power Query, select InvoiceDate, and use Add Column, Date, Month, Start of Month (Power Query names the new column Start of Month). Close & Apply, then build a line chart with Start of Month on the X-axis and Total Revenue on the Y-axis. In the lessons that follow, a proper date table replaces this shortcut.

Step 3: check the numbers outside Power BI

A habit worth building from your first report: check the headline numbers with a second tool. This DuckDB script (run pip install duckdb, then download the CSV above as online-retail.csv) reproduces exactly what the three visuals compute:

check_first_report.py
import duckdb

retail = duckdb.sql("""
    select *, Quantity * UnitPrice as Revenue,
           date_trunc('month', InvoiceDate) as Month
    from read_csv('online-retail.csv',
                  types = {'InvoiceNo': 'VARCHAR', 'StockCode': 'VARCHAR', 'CustomerID': 'VARCHAR'},
                  timestampformat = '%m/%d/%Y %H:%M')
""")

print(duckdb.sql("""
    select count(*) as rows,
           round(sum(Revenue), 2) as total_revenue,
           sum(Quantity) as sum_of_quantity,
           sum(cast(CustomerID as bigint)) as sum_of_customerid,
           count(*) - count(CustomerID) as blank_customer_rows,
           min(Quantity) as min_qty,
           min(UnitPrice) as min_price
    from retail
"""))
print(duckdb.sql("""
    select Country, round(sum(Revenue), 2) as revenue
    from retail group by Country order by revenue desc limit 5
"""))
print(duckdb.sql("""
    select strftime(Month, '%Y-%m') as month, round(sum(Revenue), 2) as revenue
    from retail group by Month order by Month
"""))
output
┌────────┬───────────────┬─────────────────┬───────────────────┬─────────────────────┬─────────┬───────────┐
│  rows  │ total_revenue │ sum_of_quantity │ sum_of_customerid │ blank_customer_rows │ min_qty │ min_price │
│ int64  │    double     │     int128      │      int128       │        int64        │  int64  │  double   │
├────────┼───────────────┼─────────────────┼───────────────────┼─────────────────────┼─────────┼───────────┤
│ 541909 │    9747747.93 │         5176450 │        6219475867 │              135080 │  -80995 │ -11062.06 │
└────────┴───────────────┴─────────────────┴───────────────────┴─────────────────────┴─────────┴───────────┘
 
┌────────────────┬────────────┐
│    Country     │  revenue   │
│    varchar     │   double   │
├────────────────┼────────────┤
│ United Kingdom │ 8187806.36 │
│ Netherlands    │  284661.54 │
│ EIRE           │  263276.82 │
│ Germany        │  221698.21 │
│ France         │   197403.9 │
└────────────────┴────────────┘
 
┌─────────┬────────────┐
│  month  │  revenue   │
│ varchar │   double   │
├─────────┼────────────┤
│ 2010-12 │  748957.02 │
│ 2011-01 │  560000.26 │
│ 2011-02 │  498062.65 │
│ 2011-03 │  683267.08 │
│ 2011-04 │  493207.12 │
│ 2011-05 │  723333.51 │
│ 2011-06 │  691123.12 │
│ 2011-07 │  681300.11 │
│ 2011-08 │  682680.51 │
│ 2011-09 │ 1019687.62 │
│ 2011-10 │ 1070704.67 │
│ 2011-11 │ 1461756.25 │
│ 2011-12 │  433668.01 │
└─────────┴────────────┘

Your card should show 9,747,747.93 (displayed as 9.75M with the default auto display units), the bar chart should start with United Kingdom at 8,187,806.36, and the line chart should follow the monthly figures above.

Step 4: the three numbers that look wrong

A report that runs is not a report that is right. Look again:

  1. Revenue includes cancellations and adjustments. min_qty is -80,995 and min_price is -11,062.06. Invoices starting with C are cancellations with negative quantities, and stock code B ("Adjust bad debt") is an accounting entry, not a sale. Total Revenue of 9.75M is net of returns and contains non-product lines; the business number you will build in the next two lessons is 8.91M.

  2. 135,080 rows have no customer. A quarter of the lines have a blank CustomerID. Any "revenue per customer" figure built on this table is wrong until you decide what to do with them.

  3. December 2011 looks like a collapse. 433,668 against 1,461,756 in November. The data stops on 9 December 2011, so December is a partial month. A chart that shows it without a note will start a panic in a review meeting.

And a fourth one you created yourself: drag CustomerID into a table visual and Power BI shows Sum of CustomerID = 6,219,475,867, a meaningless number, because it typed the column as a whole number and summarised it. Change CustomerID to Text in Power Query and the problem disappears.

Common mistakes

  • Clicking Load instead of Transform data. You accept Power BI's type guesses from the first 200 rows and load columns you do not need. Open Power Query every time, even just to check types.

  • Leaving Auto date/time on. Every date column gets a hidden table, the file grows, and date logic later conflicts with your own date table. Turn it off globally once.

  • Building visuals from implicit measures. "Sum of UnitPrice" looks like a number but adds up prices, which is meaningless. Write explicit measures and set IDs and prices to Don't summarize.

  • IDs stored as numbers. IDs are labels, not quantities. Store them as text so they are never summed and so leading zeros (common in Indian PIN codes and employee IDs) survive.

  • Saving only one .pbix on the desktop. Files corrupt, laptops die. Keep files in OneDrive, SharePoint or Git from the first day.

  • Trusting the first number you see. Always reconcile one headline figure with a second source (the source system, an Excel pivot, or a SQL query) before you share anything.

Interview angle

What is the difference between Power BI Desktop and the Power BI service?

Desktop is the free Windows authoring tool: you connect to data, transform it in Power Query, build the model and DAX measures, and design report pages. The service is the cloud platform where you publish those reports and semantic models, share them through workspaces and apps, schedule refresh (through a gateway for on-premises sources), apply row-level security roles to users, and set up subscriptions and alerts. You can edit reports in the service, but data modelling is done mostly in Desktop.

What is an implicit measure, and why do teams avoid them?

It is the automatic aggregation Power BI creates when you drag a numeric column into a visual, based on the column's default summarization. Teams avoid them because they cannot be reused or documented, they happily sum IDs and prices, they do not work in Analyze in Excel, and they stop working once the model has calculation groups. The standard is explicit DAX measures plus "Don't summarize" on non-additive columns.

Which Power BI licence does a company need to share reports with 300 employees?

Either every author and viewer needs Pro (or PPU if the content uses Premium features), or the workspace sits on a Fabric F64 or larger capacity (or a Premium P capacity), in which case viewers can use a free licence while authors still need Pro or PPU. The break-even depends on the number of viewers, which is why large companies buy capacity.

Practice task

  1. Install Power BI Desktop (or set up a Windows VM) and turn off Auto date/time in both Global and Current File options.

  2. Load the Online Retail CSV from the URL above with Transform data, add the Revenue column, and change CustomerID to Text.

  3. Build the card, the country bar chart and the monthly line chart, using an explicit Total Revenue measure.

  4. Add a text box to the page listing the three issues from Step 4 in one sentence each.

  5. Save the file as online-retail-v1.pbix in a folder with version history.

Done when: your card reads 9.75M, United Kingdom tops the bar chart at 8.19M, November 2011 is the highest month, and your text box names the cancellations, the blank customers and the partial December.

Show a solution
  • Card: Total Revenue = SUM ( Retail[Revenue] ), value 9,747,747.93.

  • Bar chart top five: United Kingdom 8,187,806.36, Netherlands 284,661.54, EIRE 263,276.82, Germany 221,698.21, France 197,403.90.

  • Line chart: November 2011 is the peak at 1,461,756.25; December 2011 drops to 433,668.01 because the data ends on 9 December.

  • Text box: "Revenue includes cancellations (negative quantities) and bad-debt adjustments. 135,080 lines have no customer ID. December 2011 covers 1 to 9 December only."

Further reading