Download the files
| File | What it is |
|---|---|
| FactSmoreSales.csv | 12,000 order lines |
| DimProduct.csv | 16 products |
| DimCustomer.csv | 120 customers across 4 regions |
| DimDate.csv | Daily calendar, Jan 2024 through Jun 2026 |
| gen2.py | The script that generated the CSVs, if you’re curious |
Before you start
- Power BI Desktop — free download, needed to build the model.
- Power BI Report Builder — free download, needed from Part 2 onward. Windows only.
- A Power BI Pro or Premium Per User license if you want to publish to a shared workspace. A free license works too, but only for My Workspace.
Step 1: Build the semantic model
Load the data
Open Power BI Desktop and choose Get Data → Text/CSV. Load all four CSVs.
Rename the tables
This matters more than it looks. The DAX in Part 3 refers to these names directly, so if you rename them differently the code samples won’t run as written.
| Imported as | Rename to |
|---|---|
| FactSmoreSales | Smore Sales Table |
| DimProduct | Dim Product |
| DimCustomer | Dim Customer |
| DimDate | Dim Date |
Check the data types
Desktop usually gets these right, but it’s worth a look.
- Date columns → Date
- Quantity → Whole number
- UnitPrice, SalesAmount, ListUnitPrice → Decimal number
- IsOrganic, IsWeekend → Whole number
Create three relationships
In Model view, drag these into place. All three are many-to-one with a single cross-filter direction, which is the default.
| From | To |
|---|---|
| Smore Sales Table[ProductKey] | Dim Product[ProductKey] |
| Smore Sales Table[CustomerKey] | Dim Customer[CustomerKey] |
| Smore Sales Table[Date] | Dim Date[Date] |
Then right-click Dim Date and choose Mark as date table, using the Date column. If the relationships look like a star with the fact table in the middle and the dimensions pointing inward, you’ve got it right.
Add the measures
On Smore Sales Table:
Total Quantity = SUM ( 'Smore Sales Table'[Quantity] )
Total Sales = SUM ( 'Smore Sales Table'[SalesAmount] )
Order Lines = COUNTROWS ( 'Smore Sales Table' )
Average Line Value = DIVIDE ( [Total Sales], [Order Lines] )
Average Unit Price = DIVIDE ( [Total Sales], [Total Quantity] )
Format Total Sales, Average Line Value and Average Unit Price as currency with 2 decimal places. Format Total Quantity and Order Lines as whole numbers with a thousands separator.
Tidy up (optional but recommended)
Hide the key columns from report view: SalesKey, ProductKey and CustomerKey on the fact table, and ProductKey and CustomerKey on the dimensions. Nobody needs to see them in a field list, and hiding them nudges you toward using measures — which is the whole point of Part 3.
Step 2: Check your numbers
Do this before you go any further. Drop three card visuals on a blank page.
| Measure | You should see |
|---|---|
| Order Lines | 12,000 |
| Total Quantity | 410,120 |
| Total Sales | $2,968,210.33 |
Then add a filter for Dim Customer[RegionName] = "Midwest":
| Measure | You should see |
|---|---|
| Order Lines | 3,314 |
| Total Sales | $822,298.65 |
Step 3: Publish
Save the file as SmoreSales.pbix, then Publish to your workspace.
Two things appear in the workspace, not one: a report and a semantic model. That split is explained in Part 2, and the semantic model is the thing the paginated reports connect to.
Keep the .pbix. Part 3 uses Power BI Desktop’s Performance Analyzer, so you’ll want the local file open again.
Troubleshooting
My semantic model doesn’t appear in Report Builder’s picker
Almost always permissions. You need at least the Contributor role in the workspace to publish the report, and Build permission on the semantic model to see it in the picker. Being able to view a report is not the same as being allowed to query the model behind it.
Report Builder says “error authenticating”
Usually an expired token rather than anything you did. It often shows up the moment you add a filter, because that’s the first action that makes Report Builder go back to the model for real instead of using cached metadata. Sign out and back in using the account button in the top-right corner. If that doesn’t clear it, close Report Builder completely and reopen. Failing that, clear the cached credentials under %LOCALAPPDATA%\Microsoft\Power BI Report Builder and sign in fresh. If your account uses multi-factor authentication, check that no username or password is stored in the connection string, since Report Builder needs to prompt you interactively.
My numbers don’t match the ones above
Check three things in order. Did all 12,000 rows load, or did the CSV import truncate? Are all three relationships present and pointing dimension-to-fact? And is SalesAmount a decimal number rather than text? A single column typed as text will quietly break the totals.
Report Builder won’t install
Report Builder is a Windows desktop application. Per the Microsoft Download Center listing, the supported operating systems are Windows 10, Windows 11, Windows Server 2016, Windows Server 2019 and Windows Server 2022, and it requires .NET Framework 4.7.2. Microsoft also supports running it on Azure Virtual Desktop and Windows 365, but not as a virtualized published app such as Citrix.
On a Mac or Linux machine you’ll need a Windows VM. You can still follow Part 2’s concepts and do simpler authoring in the browser, but Parts 2 through 5 assume Report Builder.
Dragging a number into the Query Designer returns thousands of rows
That’s not a bug, and it’s exactly what Part 3 is about. Use a measure rather than a raw column.
About the data
Generated, not real. Sales are seasonal, peaking May through September, because s’mores are a summer business and a flat distribution would have made the paginated output boring. SalesAmount equals Quantity × UnitPrice on every row, so any total you calculate independently will reconcile. UnitPrice varies from the product’s list price by a promotional discount, which is why it has more distinct values than you’d expect.
gen2.py reproduces the CSVs byte-for-byte from a fixed seed, so the figures above stay stable.
Paginated Reports 101
References
- What are paginated reports in Power BI?
- When to use paginated reports in Power BI
- Data retrieval guidance for paginated reports
- Performance and scalability considerations
- Create a paginated report based on a Power BI semantic model
- Supported data sources for Power BI paginated reports
- Publish a paginated report to the Power BI service
- Paginated reports in Power BI: FAQ
- Power BI Report Builder change log
- Download Power BI Report Builder
- Author paginated reports in the Power BI service
- Add cascading parameters to a paginated report
- Use cascading parameters in paginated reports
- Row-level security (RLS) with Power BI
- Microsoft Fabric licenses
- Important update coming to Power BI Premium licensing
- What is Microsoft Fabric Git integration?
- microsoft/RdlMigration