PL-300 cheat sheet
PL-300 · Keep the key ideas within reach.
Prepare the data
Column profiling in Power Query scans the first 1000 rows by default; select 'Column profiling based on entire dataset' in the status bar to profile every row.
Merge joins tables horizontally on matching key columns (Inner, Left Outer, Right Outer, Full Outer, Left Anti, Right Anti); Append stacks tables vertically, aligning rows by matching column names.
Query folding translates steps into one native query at the source; steps such as Add Index or merging a non-foldable source break folding - confirm with View Native Query.
Use 'Using Locale' when a text column must be converted under a specific culture, for example resolving dd/MM/yyyy versus MM/dd/yyyy source dates.
Unpivot Columns converts wide cross-tab columns into Attribute/Value pairs; Pivot Column performs the inverse and aggregates duplicate values.
Group By supports Sum, Average, Min, Max, Count Rows, Count Distinct Rows and All Rows; All Rows returns the detail rows as a nested table column.
Privacy levels are None, Public, Organizational and Private; when sources are combined the most restrictive level applies and may prevent folding.
Errors are values in Power Query: Remove Errors deletes the row, Replace Errors substitutes a value, and M handles them with try ... otherwise.
Dataflows run the transformation in the Power BI service and store output tables in the workspace's Azure Data Lake Storage Gen2 account.
Model the data
Star schema: fact tables hold keys and numeric measures, dimension tables hold descriptive attributes, and relationships run one-to-many from dimension to fact with single-direction filtering.
Filter context flows from the 'one' side to the 'many' side; the reverse requires bidirectional cross-filtering, which can raise an ambiguous relationship error when multiple paths exist.
CALCULATE(expression, filters...) evaluates the expression in a modified filter context and overwrites existing filters on the same columns unless KEEPFILTERS is applied.
SUMX, AVERAGEX and COUNTX iterate row by row over a table and aggregate an expression; use them when the expression must be evaluated per row before aggregation.
USERELATIONSHIP inside CALCULATE activates an inactive relationship for that calculation only; RELATED returns one value from the one side and RELATEDTABLE returns many-side rows.
A date table needs one row per date, contiguous dates covering the data, no blank dates, and must be set with 'Mark as date table' before time-intelligence functions behave correctly.
DIVIDE(numerator, denominator [, alternate]) returns BLANK, or the alternate value, instead of an error when the denominator is zero or blank.
Calculated columns and calculated tables are computed at refresh and stored in the model; measures are computed at query time and consume no model memory.
Variables declared with VAR and returned with RETURN are evaluated once, so reuse them to avoid recomputing an expensive expression.
Visualize and analyze the data
Filter scope: visual-level applies to one visual, page-level to one page, report-level to all pages, and drillthrough filters apply only when a drillthrough page is opened.
Sync slicers from View > Sync slicers to apply one slicer selection across pages; sync and visibility are set independently for each page.
Bookmarks capture display state (visibility), data state (filters and slicers) and the current page; use them with buttons for navigation and storytelling.
Drillthrough requires a drillthrough field on the target page, and the 'Keep all filters' option preserves the source page filter context.
A what-if parameter creates a table with GENERATESERIES plus a slicer; read the selected value in DAX with SELECTEDVALUE(Parameter[Value]).
Key Influencers ranks which categorical fields most increase or decrease a chosen metric and needs a model with an imported or DirectQuery table containing explanatory columns.
Performance Analyzer logs DAX query time, visual display time and rendering time per visual, so it locates slow visuals rather than measuring total page load.
A dashboard is a single-page canvas of tiles pinned from one or more reports and supports data alerts and Q&A; only tiles pinned from a live report page carry that page's filters.
Conditional formatting can be driven by rules, a gradient or a field value, and applied to background color, font color, data bars, icons and web URL.
Manage and secure Power BI
Workspace roles: Admin manages the workspace, members and deletion; Member publishes and updates the app; Contributor creates and edits content but cannot publish the app; Viewer is read-only.
Apps package workspace content for distribution with audiences, where each audience receives a different content set; content changes reach users only after the app is updated.
Deployment pipelines move content through Development, Test and Production stages using deployment rules to swap dataset parameters per stage; permissions are not copied.
An on-premises data gateway in standard mode supports scheduled refresh and DirectQuery to on-premises sources; personal mode is bound to one user and cannot be shared.
Scheduled refresh limits: 8 refreshes per day per dataset on Pro or shared capacity, 48 per day on Premium, PPU or Fabric capacity.
Row-level security roles are authored in Desktop as DAX table filters, verified with View as role, and assigned to users or groups in the dataset's Security page; workspace Admins, Members and Contributors can see all data.
Promoted endorsement can be applied by any author with write permission; Certified endorsement requires a certifier designated by the Power BI admin.
Sensitivity labels come from Microsoft Purview, travel with exported files, and can enforce encryption and restrict export to Excel, PDF and PowerPoint.
Dynamic RLS typically matches USERPRINCIPALNAME() against a security mapping table; sharing a report grants read access, while Build permission on the dataset lets recipients create content on it.