🎯 What You'll Learn

πŸ“‹ Before You Begin

πŸ”‘ Core Concepts Mapping

Every Excel feature you already know has a Power BI equivalent. The table below is your permanent reference.

Excel FeaturePower BI EquivalentKey Difference
Excel Table (Ctrl+T)Dataset TablePower BI requires structured tables; named tables become data entities
PivotTableMatrix VisualSame drag-and-drop logic; Power BI adds interactive cross-filtering
PivotChartReport VisualsPower BI visuals are live-connected to the data model β€” no copy-paste needed
SlicerSlicer VisualWorks identically; can sync across multiple report pages in Power BI
VLOOKUP / XLOOKUPRelationships + RELATED()Power BI uses model relationships β€” no formulas needed to join tables
SUMIFS / COUNTIFSCALCULATE() + FILTER()DAX measures are more dynamic β€” they respond to visual filters automatically
Named RangeColumn ReferencePower BI uses Table[Column] syntax exclusively β€” ranges don't exist
Data β†’ From Table/RangePower Query EditorSame interface in Excel and Power BI Desktop β€” identical M code

πŸ”„ Formula Translation Guide

Browse by formula category β€” each tab shows the Excel syntax and its DAX equivalent side by side.

Excel β†’ DAX
=XLOOKUP([ProductID], Products[ProductID], Products[ProductName])
-- Excel: finds ProductName by matching ProductID

-- Power BI DAX equivalent (after creating relationship in Model View):
RELATED(Products[ProductName])
-- DAX: navigates the relationship β€” no column matching needed
Translation Rule
Excel XLOOKUP β†’ Create relationship in Model View β†’ Use RELATED() in calculated column
Excel β†’ DAX
=VLOOKUP(A2, Table2, 3, FALSE)
-- Excel: brittle column-number approach

-- Power BI: Don't write a formula. Instead:
-- Step 1: Model View β†’ drag CustomerID (Orders) to CustomerID (Customers)
-- Step 2: In DAX column: RELATED(Customers[CustomerName])
-- DAX: relationship-driven β€” survives column reordering
Translation Rule
VLOOKUP β†’ Model Relationship β†’ RELATED()   (never write column numbers in DAX)
Excel β†’ DAX
=IF([Revenue]>1000, "High", "Low")
-- Excel: simple binary conditional

-- Power BI New Column:
OrderSize = IF(Sales[Revenue] > 1000, "High", "Low")
-- DAX: identical syntax β€” IF works the same way
Translation Rule
Excel IF() β†’ DAX IF()   (syntax is identical β€” direct 1:1 translation)
Excel β†’ DAX
=IFS([Region]="East", 0.1, [Region]="West", 0.15, TRUE, 0.05)
-- Excel: multi-branch IFS

-- Power BI DAX equivalent:
Discount = SWITCH(TRUE(),
    Sales[Region] = "East",  0.1,
    Sales[Region] = "West",  0.15,
    0.05)
-- DAX: SWITCH(TRUE(), ...) is the standard multi-branch pattern
Translation Rule
Excel IFS() β†’ DAX SWITCH(TRUE(), condition, result, ...)   (more readable for many branches)
Excel β†’ DAX
=SUMIFS(Sales[Revenue], Sales[Region], "East", Sales[Year], 2024)
-- Excel: sum with multiple conditions

-- Power BI Measure:
East2024Revenue = CALCULATE(
    SUM(Sales[Revenue]),
    Sales[Region] = "East",
    Sales[Year] = 2024
)
-- DAX: CALCULATE modifies filter context β€” far more dynamic
Translation Rule
SUMIFS(range, col1, val1, col2, val2) β†’ CALCULATE(SUM(col), filter1, filter2)
Excel β†’ DAX
=AVERAGEIF(Sales[Quantity], ">10")
-- Excel: average with one condition

-- Power BI Measure:
AvgLargeOrders = AVERAGEX(
    FILTER(Sales, Sales[Quantity] > 10),
    Sales[Quantity]
)
-- DAX: AVERAGEX iterates a filtered table row-by-row
Translation Rule
AVERAGEIF β†’ AVERAGEX(FILTER(table, condition), expression)
Excel β†’ DAX
=TEXT([OrderDate], "YYYY-MM")
-- Excel: formats a date as "2024-03" string

-- Power BI DAX:
MonthKey = FORMAT(Sales[OrderDate], "YYYY-MM")
-- DAX: FORMAT() is the direct equivalent of TEXT()
Translation Rule
Excel TEXT(value, format) β†’ DAX FORMAT(value, format)   (same format strings)
Excel β†’ Power Query M
=TRIM([CustomerName])
-- Excel formula: trims leading/trailing spaces

-- In Power Query (M language):
Table.TransformColumns(Source, {"CustomerName", Text.Trim})
-- M: applies Text.Trim to an entire column at once

-- In DAX calculated column:
CleanName = TRIM(Customers[CustomerName])
-- DAX TRIM also removes extra internal spaces
Translation Rule
TRIM() works in Excel, Power Query (Text.Trim), and DAX β€” all three remove leading/trailing spaces

⚑ Power Query Quick Reference

The Power Query interface is identical in Excel and Power BI Desktop. Learn it once, use it everywhere.

UI Steps: Home β†’ Remove Rows β†’ Remove Duplicates

M Code
Table.Distinct(Source)
-- Removes all duplicate rows from the table
Result
510 rows β†’ 452 rows (duplicate orders removed)
βœ… Pro Tips: Always name your queries (right-click β†’ Rename). Apply steps in this order: Filter early β†’ Transform β†’ Load. Use "Reference" queries to build modular pipelines. Disable load on intermediate queries (right-click β†’ uncheck Enable Load).

πŸ”— Data Modeling Fundamentals

Primary Key vs. Foreign Key

Table Structure
πŸ“‹ Customers Table (Dimension)
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ CustomerID  β”‚ CustomerName     β”‚  ← Primary Key (unique, no repeats)
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ CUST0001    β”‚ Acme Corp        β”‚
β”‚ CUST0002    β”‚ TechStart Inc    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“¦ Orders Table (Fact)
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ OrderID  β”‚ CustomerID  β”‚ Revenue β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ ORD1001  β”‚ CUST0001    β”‚ $1,250  β”‚  ← Foreign Key (same customer can appear many times)
β”‚ ORD1002  β”‚ CUST0001    β”‚ $890    β”‚
β”‚ ORD1003  β”‚ CUST0002    β”‚ $2,100  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
Relationship Rule
Customers[CustomerID] (1) ────── (*) Orders[CustomerID]
One customer can have MANY orders β†’ this is a One-to-Many (1:*) relationship

Star Schema (Best Practice) 🌟

CardinalityExcel EquivalentPower BI Setup
One-to-Many (1:*)XLOOKUP from Fact β†’ DimensionModel View β†’ Drag PK β†’ FK
Many-to-One (*:1)Same direction reversedSame setup; filter direction matters
One-to-One (1:1)Rare β€” usually merge tablesAvoid; combine tables in Power Query instead
🌟 Star Schema Rule: One central Fact table (e.g., Sales with many rows) surrounded by Dimension tables (Date, Product, Customer, Region). Each dimension connects to the fact via a 1:* relationship. This is the Power BI model everyone strives for.

πŸš€ Power BI Workflow (After Excel Prep)

  1. Get Data β€” Home β†’ Excel Workbook β†’ Select your named Tables (not the whole file)
  2. Transform Data β€” Power Query Editor opens. Clean, type-correct, and filter. Do not click Load immediately.
  3. Model View β€” Create relationships by dragging Primary Key to Foreign Key across tables
  4. Report View β€” Drag fields to create visuals. Same logic as PivotTable rows/values/columns.
  5. Publish β€” Power BI Service β†’ Share dashboards with your team and set scheduled refresh

⚠️ Common Pitfalls to Avoid

❌ Excel Habitβœ… Power BI Fix
Using merged cells for headersNever merge β€” use proper flat Table headers with unique column names
Referencing cells like B2:B100Always use Table[Column] structured references in all formulas
Hardcoding values in formulas (e.g., "2024")Use Parameters or separate lookup tables for dynamic values
Multiple summary tables on one sheetOne fact table + separate dimension tables (star schema)
Manual data refresh every morningSet up scheduled refresh in Power BI Service β€” automatic and reliable
Using colors or highlights to convey meaningUse conditional formatting rules or DAX measures β€” no manual coloring

πŸ“₯ Practice Dataset Files

FileRowsPurposeStudent Action
tbl_Customers_Clean.csv100Dimension tableImport as-is; use for relationships
tbl_Products_Clean.csv50Dimension tableImport as-is; use for lookups
tbl_Regions_Clean.csv5Lookup tableOptional; practice merging
Sales_Raw_Messy.csv510Main practice fileClean using Power Query (see steps below)
Sales_Clean_Reference.csv452Answer keyVerify your cleaning results

Suggested Student Workflow

  1. Open Sales_Raw_Messy.csv in Office.com Excel and convert to Table β†’ Name it tbl_Sales_Raw
  2. Open Power Query: Data β†’ From Table/Range
  3. Remove duplicate rows
  4. Trim CustomerID and Notes columns to remove whitespace
  5. Standardize Region to Title Case (Transform β†’ Format β†’ Capitalize Each Word)
  6. Filter out rows where Notes contains "TEST"
  7. Remove rows with blank CustomerID or blank OrderDate
  8. Close & Load To… β†’ Table β†’ Name output tbl_Sales_Clean
  9. Build a PivotTable: Revenue by Region and Product Category
  10. Compare row count and totals to Sales_Clean_Reference.csv

πŸƒ Flashcard Review

Click each card to reveal the Power BI equivalent.

XLOOKUP

Tap to reveal Power BI equivalent

RELATED()
After creating a Model View relationship between tables
SUMIFS()

Tap to reveal Power BI equivalent

CALCULATE(SUM(), filters)
DAX measure with filter arguments
PivotTable

Tap to reveal Power BI equivalent

Matrix Visual
Same rows/columns/values drag-and-drop
TEXT(date, "YYYY-MM")

Tap to reveal Power BI equivalent

FORMAT(date, "YYYY-MM")
Identical format strings in DAX
Primary Key

Tap to reveal definition

Unique column in a Dimension table
e.g., CustomerID in Customers table β€” no repeats
IFS()

Tap to reveal Power BI equivalent

SWITCH(TRUE(), cond1, val1, ...)
Standard multi-branch pattern in DAX

🧠 Practice Quiz

6 questions covering formulas, Power Query, and data modeling.

1. What is the correct DAX measure to sum Revenue only for the East region in 2024?

=SUMIFS(Sales[Revenue], Sales[Region], "East", Sales[Year], 2024)
CALCULATE(SUM(Sales[Revenue]), Sales[Region]="East", Sales[Year]=2024)
FILTER(SUM(Sales[Revenue]), Sales[Region]="East")
RELATED(Sales[Revenue], "East", 2024)

2. Which Power Query M function removes all duplicate rows from a table?

Table.RemoveDuplicates(Source)
Table.Distinct(Source)
Table.SelectRows(Source, each [Unique]=true)
Table.Filter(Source, "Distinct")

3. In a star schema, a Sales Fact table has a CustomerID column that matches CustomerID in the Customers Dimension. What type of join is Power BI's relationship in Model View?

Many-to-Many (*:*)
One-to-One (1:1)
One-to-Many (1:*) β€” one customer to many orders
Many-to-One β€” orders to one customer

4. You want to average orders where Quantity > 10 in Power BI. Which DAX pattern is correct?

AVERAGEIF(Sales[Quantity], ">10")
CALCULATE(AVERAGE(Sales[Quantity]), ">10")
AVERAGEX(FILTER(Sales, Sales[Quantity] > 10), Sales[Quantity])
FILTER(AVERAGE(Sales[Quantity]), Sales[Quantity] > 10)

5. Which Excel habit is most likely to break a Power BI data model?

Using structured table references like tbl_Sales[Revenue]
Naming tables consistently with tbl_ prefix
Using merged header cells and cell references like B2:B100
Converting ranges to Tables with Ctrl+T

6. What is the DAX equivalent of the Excel function =TEXT(OrderDate, "YYYY-MM")?

DATEFORMAT(Sales[OrderDate], "YYYY-MM")
CONVERT(Sales[OrderDate], "YYYY-MM")
FORMAT(Sales[OrderDate], "YYYY-MM")
TEXT(Sales[OrderDate], "YYYY-MM")

🏁 Key Takeaways