What interviewers actually check in a Power BI interview
A Power BI interview is not a quiz on ribbon buttons. The interviewer is checking whether you understand the data model, can write correct DAX, and can turn a business question into a reliable report. The six areas below come up in almost every Power BI interview, from fresher to senior level.
Power BI ecosystem
Desktop vs Service vs Mobile, the on-premises data gateway, workspaces and apps, and how content moves from authoring to sharing.
Power Query and data preparation
Connecting to sources, choosing Import vs DirectQuery, shaping data with the M language, and handling parameters and incremental refresh.
Data modelling
Star schema vs snowflake, relationships and cardinality, cross-filter direction, the date table, and why a clean model beats clever DAX.
DAX and time intelligence
Measures vs calculated columns, row context vs filter context, CALCULATE, ALL and ALLSELECTED, time intelligence functions and variables.
Report design and interaction
Slicers and sync slicers, drill-down and drill-through, bookmarks, tooltips, and building a layout that answers a business question.
Security and operations
Row-level security (static and dynamic), scheduled refresh, gateway setup, workspaces and deployment pipelines, and the Performance Analyzer.
Power BI interview questions for freshers
These are the questions that come first in a fresher Power BI interview. They check whether your fundamentals are clear — answer with a short definition, then one line of why it matters in a real report.
Q01 What is Power BI, and what are its main components? +
Power BI is Microsoft's business intelligence platform for connecting to data, building models and publishing interactive reports and dashboards. It has four main components:
- Power BI Desktop — the authoring tool where you connect, model and build reports.
- Power BI Service — the cloud portal where reports are published, refreshed and shared.
- Power BI Mobile — apps for iOS and Android that display reports on phones and tablets.
- On-premises data gateway — a bridge that lets the cloud service refresh data from sources inside the company network.
Desktop is for building; Service is for sharing and refresh; Mobile is for viewing; the gateway keeps on-premises data in sync.
Q02 What is Power Query, and why is it used? +
Power Query is the data preparation engine in Power BI. It connects to sources, cleans and transforms data, and loads the result into the model.
Every step you take in the Power Query Editor is recorded as a step in the Applied Steps pane and written as M code. That means the transformation is repeatable — the next time you refresh, the same steps run against the new data.
Use Power Query for renaming columns, changing data types, removing duplicates, splitting and merging columns, unpivoting wide tables, and filtering rows before they reach the model.
Q03 What are the connectivity modes in Power BI? +
| Mode | How it works | Use when |
|---|---|---|
| Import | Data is copied into the Power BI model and compressed | Best performance; data can be up to a few hours old |
| DirectQuery | Queries are sent to the source on every interaction | Data must be near real-time, or the dataset is too large to import |
| Live connection | Connects to an existing Power BI dataset or SSAS model | Reuse an existing shared dataset instead of rebuilding it |
| Composite | Mixes Import and DirectQuery tables in one model | Some tables small and fast, others large and near real-time |
Most reports use Import because it is fastest. DirectQuery is chosen when freshness or data size forces it. Composite is used when a single model must mix the two.
Q04 What is the difference between a star schema and a snowflake schema? +
A star schema has one central fact table surrounded by flat dimension tables. Each dimension is a single table with all the descriptive columns.
A snowflake schema normalises those dimensions into multiple related tables — for example, Product → Category → Department.
| Star schema | Snowflake schema |
|---|---|
| Fewer tables, simpler joins | More tables, more joins |
| Faster DAX, fewer relationship paths | Slower queries, more relationship paths |
| More storage — dimensions are denormalised | Less storage — dimensions are normalised |
| Recommended for Power BI | Used when the source system is already normalised |
In Power BI, flatten snowflakes into star schemas in Power Query wherever practical. Simpler models mean faster measures and fewer mistakes.
Q05 What are the different relationship cardinalities in Power BI? +
There are three cardinality types:
- One-to-many (1:*) — the most common. One row in the dimension matches many rows in the fact table. Example: one Product row, many Sales rows.
- Many-to-one (*:1) — the same relationship from the fact side.
- One-to-one (1:1) — one row in each table. Rare, often used for splitting a wide table.
- Many-to-many (*:*) — supported in Power BI, but needs care. Usually handled by an intermediate bridge table.
Always try to model relationships as one-to-many from a dimension to a fact table. Many-to-many relationships often signal a modelling problem that should be fixed in Power Query.
Q06 What is the difference between a calculated column and a measure? +
| Calculated column | Measure |
|---|---|
| Computed row by row when the model refreshes | Computed at query time, based on filter context |
| Stored in the model, uses memory | Not stored, calculated on the fly |
| Evaluated in row context | Evaluated in filter context |
| Can be used in slicers, rows and columns | Used in values and visual-level filters |
Example: Sales[LineTotal] = Sales[Qty] * Sales[Price]
|
Example:
Total Sales = SUMX(Sales, Sales[Qty] * Sales[Price])
|
Rule of thumb: use a measure for anything that aggregates. Use a calculated column only when the value must be sliced, filtered or used in a relationship.
Q07 What is the difference between row context and filter context? +
Row context means "the current row". It
exists inside a calculated column and inside
iterator functions like SUMX and FILTER. In row
context, you can read the value of the current row
directly — Sales[Qty].
Filter context means "the filters applied to the data at the moment of evaluation". It comes from slicers, rows and columns in a visual, page filters and report filters, plus any filters added by CALCULATE.
Example: in a table visual by Year and Product, each cell evaluates the measure under a filter context of that Year and Product. The measure adds up only the rows that survive those filters.
Q08 What is CALCULATE in DAX? +
CALCULATE is the most important DAX function. It evaluates an expression in a modified filter context.
Sales Red =
CALCULATE(
[Total Sales],
Product[Color] = "Red"
)
This measure always returns sales only for Red products, regardless of what colour is selected on the page. CALCULATE takes the existing filter context and applies additional filters.
It also triggers context transition — when CALCULATE is used inside a row context, the current row becomes a filter context. That is how measures inside SUMX or FILTER evaluate row by row.
Q09 What is a date table, and why is it needed? +
A date table is a dedicated table that contains one row per date, with columns like Year, Quarter, Month, Week and Day. It is connected to the fact table through the date column.
Time intelligence functions like
TOTALYTD, SAMEPERIODLASTYEAR
and DATEADD require a proper date
table. Without one, they return wrong results.
Mark the date table as a date table in the model (Table tools → Mark as date table) and ensure it has no gaps and covers all the dates in your fact table, plus a full year on each side.
Q10 What is row-level security (RLS) in Power BI? +
Row-level security (RLS) restricts which rows a user can see in a report, based on their role. You define roles in Power BI Desktop, and assign users to those roles in the Power BI Service.
Two types:
- Static RLS — the filter is hard-coded. Example: a role "North" with the
filter
Region[Name] = "North". - Dynamic RLS — the filter uses the logged-in user's identity. Example:
Region[Email] = USERPRINCIPALNAME().
RLS filters apply to the whole model for that user. Test it in Desktop with "View as role" before publishing.
Q11 What is a slicer, and what are sync slicers? +
A slicer is a visual filter that lets the user select values — date range, product category, region. Whatever is selected filters every other visual on the page (unless the visual has been edited to not interact).
Sync slicers let the same slicer appear on multiple pages and stay in sync. Use View → Sync slicers to enable Sync and Visible per page.
Common pattern: a date slicer on every page, synced, so the user's chosen period follows them as they navigate.
Q12 What is the difference between drill-down and drill-through? +
Drill-down moves through a hierarchy within the same visual. Example: a bar chart by Year → drill to Quarter → drill to Month. The visual stays the same; the level changes.
Drill-through opens a separate report page filtered to the item you right-clicked. Example: right-click a customer name in a table and open a "Customer Detail" page filtered to that customer.
Drill-down stays in place; drill-through moves to a different page with the same filter applied.
Q13 What is a bookmark in Power BI? +
A bookmark captures the current state of a report page — filter selections, slicer values, visible visuals and drill state. When the user clicks the bookmark, the report returns to that captured state.
Common uses:
- Toggle between two views of the same data — for example, chart view and table view.
- Reset all filters to a default state with a "Reset" button.
- Build a simple navigation menu with buttons that switch pages.
Bookmarks capture the state at the moment they are created. If you change the report layout, review bookmarks to ensure they still behave as intended.
Q14 What is the difference between Power BI Desktop and Power BI Service? +
| Power BI Desktop | Power BI Service |
|---|---|
| Windows application for authoring | Cloud portal for viewing, sharing and refreshing |
| Connect to data, model, write DAX, build visuals | Publish, schedule refresh, share via workspaces and apps |
| Free to download and use | Free tier available; Pro and Premium per capacity |
| Work saved as a .pbix file | Work stored as datasets, reports and dashboards |
Desktop is the workshop. Service is the showroom — where users actually consume the report.
Q15 What is a workspace in Power BI, and how is it different from an app? +
A workspace is a container in the Power BI Service where a team stores and collaborates on datasets, reports and dashboards. Members have roles — Admin, Member, Contributor, Viewer.
An app is a packaged, read-only view of selected content from one or more workspaces. Users consume the app instead of the raw workspace, so they see only what you publish and cannot edit it.
Pattern: build and collaborate in the workspace; publish a curated app for the audience.
Intermediate Power BI interview questions
These questions come up for candidates with 2–4 years of experience. They test whether you can build a model that performs, and write DAX that answers real questions.
Q16 What is context transition in DAX? +
Context transition happens when CALCULATE is evaluated inside a row context. It converts the current row into an equivalent filter context.
That is why a measure works inside SUMX or FILTER even though it is defined as an aggregate:
High Value Customers =
COUNTROWS(
FILTER(
Customers,
[Total Sales] > 100000
)
)
Inside FILTER, the row context is the current
customer. CALCULATE inside
[Total Sales] converts that row into
a filter, so the measure returns that customer's
total.
Q17 What is the difference between FILTER and CALCULATETABLE? +
FILTER returns a table of rows that match a boolean condition. It works on any table expression, not only on an existing table.
CALCULATETABLE evaluates a table expression in a modified filter context. It is to tables what CALCULATE is to scalar expressions.
// FILTER
Red Products =
FILTER( Product, Product[Color] = "Red" )
// CALCULATETABLE
Red Products 2 =
CALCULATETABLE(
Product,
Product[Color] = "Red"
)
In practice, prefer CALCULATETABLE when you can express the filter as a straightforward condition — it is usually faster. Use FILTER when the condition must be evaluated row by row using a measure.
Q18 What is the difference between ALL, ALLEXCEPT and REMOVEFILTERS? +
- ALL(table) — returns the whole table ignoring any filter applied to it. Used inside CALCULATE to remove filters.
- ALLEXCEPT(table, column) — removes all filters on the table except the listed columns. Useful for "percent of category" while keeping the category filter.
- REMOVEFILTERS(table or column) — the modern, clearer name for the filter-removal behaviour. It does the same thing as ALL used as a filter, but the intent reads better.
% of All Products =
DIVIDE(
[Total Sales],
CALCULATE( [Total Sales], REMOVEFILTERS( Product ) )
)
New DAX code should use REMOVEFILTERS in place of ALL when the purpose is to remove filters — the intent is clearer to the next reader.
Q19 What is the difference between ALL and ALLSELECTED? +
ALL removes filters from the column or table, so the calculation uses the full dataset — regardless of what the user selected.
ALLSELECTED removes filters but respects what the user has selected outside the current visual. In other words, it gives you the "percentage of the visible selection" rather than the "percentage of everything".
% of All =
DIVIDE( [Total Sales], CALCULATE( [Total Sales], ALL( Product ) ) )
% of Selected =
DIVIDE( [Total Sales], CALCULATE( [Total Sales], ALLSELECTED( Product ) ) )
Interviewers ask this because choosing the wrong one is a common bug: percentages that do not add to 100% inside a filtered page.
Q20 How do variables (VAR) improve DAX? +
VAR / RETURN lets you name an intermediate result and reuse it in the same expression. Two benefits:
- Readability — the measure reads like a calculation, not a nested puzzle.
- Performance — DAX evaluates the variable once and reuses the value. A subexpression that appears in several places is computed only once.
YoY % =
VAR CurrentSales = [Total Sales]
VAR PriorSales = [Sales LY]
RETURN
DIVIDE( CurrentSales - PriorSales, PriorSales )
Variables are computed in the filter context where they are declared. They cannot be used outside the RETURN expression.
Q21 How does incremental refresh work in Power BI? +
Incremental refresh loads only the new or changed rows on each refresh, instead of reloading the entire table.
You set two parameters — RangeStart
and RangeEnd — and filter the fact
table in Power Query using them. Power BI then
splits the table into:
- Historical partitions — rows older than the refresh window, stored and not reloaded.
- Incremental partitions — rows inside the refresh window, reloaded on each refresh.
Benefits: faster refresh, less load on the source, and the ability to keep years of history in a dataset that only refreshes the recent slice.
Q22 What is the Performance Analyzer, and how do you use it? +
The Performance Analyzer is a pane in Power BI Desktop that records how long each visual takes to render and breaks the time down into DAX, visual display and other components.
How to use it:
- Open View → Performance Analyzer → Start recording.
- Interact with the report — click a slicer, change a filter, refresh a visual.
- Stop recording and expand the slowest visual.
- Look at the DAX query time. If it dominates, the measure needs optimising. If the display time dominates, the visual is overloaded — too many rows, too many columns.
- Copy the DAX query and test it in DAX Studio to dig deeper.
Always record on the slowest expected machine — a laptop with limited RAM — not on a fast development desktop.
Q23 What is the difference between Import and DirectQuery, and how do you choose? +
| Aspect | Import | DirectQuery |
|---|---|---|
| Data location | Copied into the model | Stays in the source |
| Freshness | Up to the last refresh | Near real-time |
| Performance | Fast — in-memory engine | Depends on source query speed |
| Model size limit | Depends on the licence and capacity | No practical limit |
| DAX complexity supported | Full DAX | Some DAX patterns fall back to slower queries |
| Best for | Most reports | Very large or very fresh data |
Choose Import unless you have a specific reason for DirectQuery — real-time reporting, a dataset larger than the capacity allows, or a security requirement to not copy data.
Q24 What are the common time intelligence functions in DAX? +
- TOTALYTD, TOTALQTD, TOTALMTD — year, quarter and month-to-date totals.
- SAMEPERIODLASTYEAR — the same period in the previous year.
- DATEADD — shift the period by a number of days, months, quarters or years.
- PARALLELPERIOD — a full period offset from the current one.
- DATESINPERIOD — a rolling window of the last N days, months or years.
- PREVIOUSMONTH / PREVIOUSQUARTER / PREVIOUSYEAR — the immediately previous period.
All of these require a properly marked date table. Without it, the results are unpredictable.
Q25 How do you implement dynamic row-level security? +
Dynamic RLS uses the logged-in user's identity to filter the data, instead of hard-coding a value per role.
- Create a mapping table that links user emails to the values they can see — for example, Email → Region.
- Relate that table to the Region dimension.
- In Manage roles, add a role with the filter:
[Email] = USERPRINCIPALNAME(). - Publish and assign users or groups to the role in the Service.
[Email] = USERPRINCIPALNAME()
Dynamic RLS scales to hundreds of users without creating hundreds of roles.
Q26 What is the difference between a dashboard and a report in Power BI? +
| Report | Dashboard |
|---|---|
| Multiple pages, built in Desktop | One canvas, built in the Service |
| Bound to a single dataset | Can pin tiles from many reports and datasets |
| Users interact with slicers and visuals | Users click a tile to jump to the source report |
| The main analysis surface | A summary surface for monitoring key numbers |
Reports are for analysis. Dashboards are for at-a- glance monitoring — a set of pinned tiles from different reports, refreshed together.
Q27 What is a calculated table, and when would you use it? +
A calculated table is a table created with a DAX expression, instead of loaded from a source. It is stored in the model like a normal table.
Common uses:
- Building a Date table with
CALENDARorCALENDARAUTO. - Creating a disconnected table for parameter selection, like a "what-if" analysis.
- Building a summarised aggregate table to speed up a slow measure.
Date =
ADDCOLUMNS(
CALENDARAUTO(),
"Year", YEAR([Date]),
"Quarter", "Q" & QUARTER([Date]),
"Month", FORMAT([Date], "mmm")
)
Calculated tables use memory. For large fact tables, prefer doing the work in Power Query instead.
Q28 What is the difference between a calculated column and an M custom column? +
| Power Query custom column (M) | DAX calculated column |
|---|---|
| Runs during refresh, before the model loads | Runs after the model loads, during refresh |
| Uses the M language | Uses DAX |
| Can use row-level transformations and merges | Can use RELATED and CALCULATE against other tables |
| Compresses better and usually costs less memory | Uses more memory — VertiPaq compression is less efficient |
| Preferred for data cleaning and type changes | Preferred when DAX functions are needed for the value |
Rule: do data preparation in Power Query, do model logic in DAX. Only add a DAX calculated column if the value needs relationships or DAX-only functions.
Q29 What is the difference between SUM and SUMX? +
SUM takes one column and adds its values in the current filter context. It does not evaluate any expression.
SUMX iterates a table, evaluates an expression for each row, then adds the results. It is used when the value you want to sum does not exist as a column.
// SUM — column exists
Total Qty =
SUM( Sales[Qty] )
// SUMX — expression must be computed
Total Sales =
SUMX( Sales, Sales[Qty] * Sales[Price] )
Interviewers ask this because many candidates write SUMX when SUM would be faster and clearer. Use the simplest function that expresses the calculation.
Q30 What is a many-to-many relationship and how do you handle it? +
A many-to-many relationship exists when neither side is unique — for example, a Student table and a Course table, where students take many courses and courses have many students.
Two ways to handle it in Power BI:
- Bridge table — create an Enrollment table with StudentID and CourseID. This bridge connects Student and Course, turning the many-to-many into two one-to-many relationships. This is the preferred modelling pattern.
- Native many-to-many relationship — Power BI allows a direct many-to-many relationship between two tables. It works, but filter behaviour can be unpredictable and DAX often returns unexpected results.
Always prefer the bridge table. It makes the model easier to reason about and the measures predictable.
Power BI interview questions for experienced professionals
These questions come up for developers with 5+ years of experience or for senior and lead roles. They test model design, performance tuning and how you operate Power BI in an enterprise.
Q31 How would you design a Power BI model from scratch? +
Step 1 — Understand the questions. List the business questions the report must answer. Model design follows from those questions, not the other way around.
Step 2 — Identify fact and dimension tables. Facts contain measurable events — Sales, Orders, Payments. Dimensions describe them — Product, Customer, Date, Store, Employee.
Step 3 — Build a star schema. One fact table in the centre, dimensions around it, all relationships one-to-many and single-direction.
Step 4 — Create a date table. One row per date, marked as a date table, connected to every fact table that needs time intelligence.
Step 5 — Clean in Power Query. Rename, change types, remove duplicates, unpivot wide columns. Keep the model simple.
Step 6 — Write measures, not columns. Use DAX measures for aggregation. Use calculated columns only when the value must be sliced or filtered.
Step 7 — Measure, then optimise. Run the Performance Analyzer on the slowest visuals and reduce cardinality, remove unused columns, and replace row-by-row DAX with set-based patterns.
Q32 How do you optimise a slow Power BI report? +
Order of impact, from biggest to smallest:
- Reduce model size. Remove unused columns, remove unused tables, and change high-cardinality text columns to integer keys where possible.
- Fix the relationships. Ensure they are one-to-many and single-direction. Avoid bidirectional filters unless there is a strong reason.
- Simplify measures. Replace row-by-row FILTER over a fact table with set-based CALCULATE and KEEPFILTERS where possible. Use variables to avoid recomputation.
- Reduce visual count. A page with 25 visuals executes 25 queries. Split content across pages or use drill-through.
- Use the Performance Analyzer. Identify the slowest visual, then check whether DAX or rendering is the bottleneck.
- Switch to Import. If the model uses DirectQuery and freshness allows, Import is almost always faster.
Optimisation is a measurement exercise, not a guessing exercise. Fix the biggest bottleneck first, then re-measure.
Q33 How do you set up scheduled refresh and the on-premises gateway? +
Gateway: if the data source is inside the company network, install an on-premises data gateway on a machine that can reach it. Register the gateway in the Power BI Service, then add the data source and credentials.
Scheduled refresh: in the Service, open the dataset settings → Scheduled refresh. Set the frequency (up to 8 times a day on Pro; more on Premium), the time zone, and the notification options for failures.
Things to check when refresh fails:
- Credentials have not expired or been rotated.
- The gateway machine is online and the gateway service is running.
- The dataset is not too large for the capacity's refresh window.
- The source schema has not changed — a renamed column breaks the query.
Q34 What is the difference between a workspace role and an app audience? +
Workspace roles control who can work inside the workspace: Admin, Member, Contributor, Viewer. These are for the build team.
App audiences control who sees what when the app is published. You can create audiences — for example, Sales, Finance, Leadership — and give each audience a different set of reports and dashboards.
Pattern: editors get workspace access; consumers get app access. Never give a consumer workspace access just so they can view a report — publish an app instead.
Q35 How do you handle a very large fact table in Power BI? +
Several techniques, chosen based on the size and freshness requirement:
- Incremental refresh — load historical data once, then refresh only the recent window.
- Aggregations — keep a small aggregate table (monthly totals) for high-level visuals, and a detail table for drill-through.
- Reduce columns — every column costs memory. Keep only what the report needs.
- Reduce cardinality — remove decimals from ID columns, split date and time, and replace long strings with keys.
- Composite model — keep dimensions and small facts in Import, leave the very large fact in DirectQuery.
- Premium capacity — larger datasets and larger refresh windows.
The right mix depends on whether the priority is report speed, freshness or storage cost. State the trade-off in the interview.
Q36 How do you compare Power BI with Tableau? +
| Aspect | Power BI | Tableau |
|---|---|---|
| Language for calculations | DAX | MDX and Tableau calculations |
| Data preparation | Power Query (M) | Tableau Prep |
| Pricing | Lower entry cost, bundled with Microsoft 365 | Higher per-seat cost |
| Visual design | Good, improving every release | Traditionally stronger for pixel-perfect visuals |
| Ecosystem | Deep integration with Excel, Azure, Fabric | Strong standalone analytics ecosystem |
| Learning curve | Easier for Excel users | Steeper for non-analysts |
In Indian enterprises, Power BI is very common because of Microsoft 365 bundling. Tableau is strong in analytics-heavy teams and some product companies. Knowing both, and the trade-offs, is a strong interview answer.
Q37 How do you handle role-based access for hundreds of users? +
Do not create a role per user. Use dynamic RLS with a user mapping table:
- Create a table
UserRegionwith columns Email, Region. - Relate it to the Region dimension in the model.
- Create a single role with the filter
[Email] = USERPRINCIPALNAME(). - Assign the role to a security group in the Service, and manage membership in Microsoft Entra (Azure AD).
When a new user joins, add them to the mapping table and the security group. No new roles, no report changes. This scales to thousands of users with one role definition.
Q38 What is a deployment pipeline in Power BI? +
A deployment pipeline manages the lifecycle of Power BI content across stages — typically Development → Test → Production.
How it works:
- Each stage is a workspace with the same content.
- You deploy from Development to Test after the change is reviewed.
- You deploy from Test to Production after testing.
- Parameters and data source rules change the connection details per stage — so Test points at Test data, Production at Production data.
Deployment pipelines need Premium or Fabric capacity. They replace the manual "download pbix, upload to another workspace" pattern that causes most deployment mistakes.
Q39 How do you audit who viewed or shared a report? +
The Power BI admin portal has an Activity log and an Audit log that record views, shares, refreshes and exports.
Where to look:
- Usage metrics — per-report view counts and viewer names, from the report itself (Requires Pro or above).
- Admin portal → Audit logs — exports to Microsoft Purview for long-term retention.
- Lineage view — shows which reports depend on which datasets, and which datasets feed which reports.
For governance, review usage metrics monthly, identify unused reports, and archive them so users see a clean library.
Q40 What is the difference between a dataset and a dataflow in Power BI? +
| Dataset | Dataflow |
|---|---|
| Contains the model — tables, relationships, measures | Contains the prepared data — tables of cleaned rows in the cloud |
| Backs a report directly | Feeds one or more datasets |
| Created in Desktop and published | Created in the Service using Power Query Online |
| Has DAX measures and relationships | No measures, no relationships — just tables |
Pattern: build a dataflow once to clean and standardise the shared data. Then multiple datasets reuse the same dataflow. It removes duplicated Power Query work across teams.
Q41 What are calculation groups, and when would you use them? +
A calculation group is a table that applies the same calculation to any measure in a visual. The classic example is a "Time Intelligence" calculation group with items like Current, YTD, LY and YoY %.
Instead of writing twelve measures for each base measure, you write one calculation group and reuse it. The user drags the calculation group into the columns area and switches between Current, YTD, LY and YoY.
Calculation groups need Tabular Editor to create, and they work best in enterprise models with many base measures. For a small model, they may be overkill.
Q42 How do you use Power BI in a Fabric or lakehouse architecture? +
In a Fabric architecture, the lakehouse stores the raw and curated data, and Power BI consumes it through a semantic model built on top.
Typical pattern:
- Data lands in OneLake as files or tables.
- Dataflows Gen2 or notebooks clean and shape it.
- A warehouse or lakehouse stores the curated star schema.
- Power BI builds a semantic model on the curated tables, adds measures, and serves reports.
- Direct Lake mode queries the lakehouse without importing the data — combining DirectQuery freshness with Import-like speed.
In interview terms, knowing where Power BI sits in the wider data platform is often more important than knowing a specific tool version.
Scenario-based Power BI interview questions
These are the questions an interviewer asks when they want to see how you think about a real problem, not just a function name. Answer with a step-by-step approach.
S01 A visual shows sales for one month even though the slicer is set to a full year. How do you debug it? +
Step 1 — Check the visual-level filter. A filter added to the visual overrides the slicer.
Step 2 — Check the measure. If the measure wraps the sum in
SAMEPERIODLASTYEAR or DATEADD without a variable, it
may be returning a shifted period.
Step 3 — Check the relationship between the fact table and the date table. If the relationship is inactive, the measure is not filtered by the date slicer at all.
Step 4 — Check whether the date table is marked as a date table. Without marking, time intelligence functions fall back to the fact table's date column, which may only cover a partial period.
Step 5 — Add a card visual of the selected date range to confirm what the slicer is actually passing to the measure.
S02 A report is slow — 12 seconds to render a single page. How do you bring it under 3 seconds? +
Step 1 — Open Performance Analyzer and identify the slowest visual. If DAX dominates, the measure needs fixing. If rendering dominates, the visual is too heavy.
Step 2 — Reduce the number of visuals per page. Ten visuals = ten queries. Split the page or use bookmarks.
Step 3 — Check the measures on the slow visual. Replace row-by-row FILTER over a fact table with a CALCULATE filter on a dimension.
Step 4 — Check for high-cardinality columns in the model. Text columns with thousands of unique values cost memory and slow aggregation.
Step 5 — Check the relationship direction. Bidirectional filters on a large fact table can be very expensive; change to single direction if possible.
Step 6 — If the model uses DirectQuery, switch to Import if the freshness requirement allows. Import is almost always faster.
S03 You need year-over-year and year-to-date comparisons. How do you build them? +
Step 1 — Confirm the date table exists, is marked, and has a relationship to the fact table.
Step 2 — Build a base measure. In the sample model on this page, that is
Total Sales = SUMX(Sales, Sales[Qty] * Sales[Price]).
Step 3 — Build the prior-year measure with
SAMEPERIODLASTYEAR:
Sales LY =
CALCULATE(
[Total Sales],
SAMEPERIODLASTYEAR( 'Date'[Date] )
)
Step 4 — Build the YoY % measure with DIVIDE, so it returns blank instead of dividing by zero:
YoY % =
DIVIDE(
[Total Sales] - [Sales LY],
[Sales LY]
)
Step 5 — Build YTD with TOTALYTD:
Sales YTD =
TOTALYTD(
[Total Sales],
'Date'[Date]
)
Step 6 — Format the YoY % measure as a percentage in the model, and place the three measures in a matrix by Year.
S04 Different regions must see only their own data. How do you implement it? +
Step 1 — Confirm the model has a Region dimension related to the fact table.
Step 2 — Create a user mapping table — Email → Region — and relate it to the Region dimension.
Step 3 — Create one role in Manage roles with the filter
[Email] = USERPRINCIPALNAME() on the mapping table.
Step 4 — Test in Desktop with View as role, entering different emails to verify the filter changes.
Step 5 — Publish the dataset. In the Service, assign the role to a security group that contains all regional users.
Step 6 — Test in the Service with "Test as role" to confirm the filter works after deployment.
This is the standard dynamic RLS pattern. It scales without creating a role per region.
S05 A source table has 50 columns but the report only needs 6. What do you do? +
Step 1 — Remove the 44 columns you do not need in Power Query, before the data reaches the model. This reduces model size and refresh time.
Step 2 — Do not remove the columns at the source — another report may need them. Remove them in this dataset only.
Step 3 — Check data types. Convert text columns that are actually numbers into numeric types, and remove the time part from datetime columns if it is not used.
Step 4 — If the remaining six columns include high-cardinality text, consider replacing the text with an integer ID and putting the text in a dimension table.
Step 5 — After refreshing, compare the model size before and after. Reducing columns usually reduces size by far more than the column count suggests, because compression improves.
S06 A measure returns a wrong total in a matrix visual but the row values look correct. What is happening? +
Step 1 — Confirm the measure is not a sum of an average or a ratio. Summing percentages or ratios gives a mathematically wrong total.
Step 2 — Check for context transition issues. If the measure uses an iterator like SUMX or AVERAGEX over a table that has a filter applied, the total is calculated over the filtered set, not the raw set.
Step 3 — Check that the measure is not a calculated column. A calculated column is summed row by row; a measure is aggregated at the visual's filter context.
Step 4 — Test the measure at the grand total level by removing all filters. If the total matches the raw sum, the issue is only the ratio or average type.
Step 5 — For ratio measures, use SUMX over the base quantities instead of a sum of ratios:
Total Margin % =
DIVIDE(
SUMX( Sales, Sales[Margin] ),
SUMX( Sales, Sales[Revenue] )
)
S07 A refresh fails at 6 AM every day with a credentials error. How do you investigate? +
Step 1 — Open the refresh history in the Service and read the error message. It usually names the source that failed.
Step 2 — Check whether the credentials for that source have expired or been rotated. Many enterprise sources force a password change every 90 days.
Step 3 — Check the gateway. If the gateway machine was rebooted or the gateway service restarted, the connection may have failed once and recovered.
Step 4 — Check the service account used by the gateway. If its password expired, all refreshes fail until it is updated.
Step 5 — Enable refresh failure notifications for the dataset so the team is alerted the moment it happens, not after a user reports stale data.
S08 How do you build a report that shows top 10 products by sales, with all others grouped? +
Step 1 — Build a base measure Total Sales.
Step 2 — Build a rank measure with RANKX over the Product table:
Product Rank =
RANKX(
ALL( Product[ProductName] ),
[Total Sales],
,
DESC,
DENSE
)
Step 3 — Build a measure that returns the product name if its rank is ten or less, and "Others" otherwise:
Top 10 Group =
VAR CurrentRank = [Product Rank]
RETURN
IF(
CurrentRank <= 10,
SELECTEDVALUE( Product[ProductName] ),
"Others"
)
Step 4 — Use the Top 10 Group measure as the row field in a bar chart, and Total Sales as the value.
Step 5 — Sort by Total Sales descending. The chart now shows ten products plus one "Others" row for everything below rank ten.
S09 A business user says the numbers in your report do not match Excel. How do you respond? +
Step 1 — Ask for the Excel file and the exact cells the user compared. Do not assume the discrepancy is real.
Step 2 — Check the definition of the measure. Excel may use a different definition of "sales" — gross vs net, before or after returns, inclusive or exclusive of tax.
Step 3 — Check the date range. Excel may include the last day of the month while Power BI's year-to-date has not refreshed yet.
Step 4 — Check the data source. Excel may be reading the source directly while Power BI reads a data warehouse or a curated view.
Step 5 — Document the measure definition and the source in the report — a "Definitions" page or tooltip. Most mismatches are definition mismatches, not data mismatches.
S10 You need a dynamic title on a chart that shows the selected year and category. How do you do it? +
Step 1 — Build a measure that reads the selected values:
Chart Title =
VAR SelectedYear =
SELECTEDVALUE( 'Date'[Year], "All Years" )
VAR SelectedCategory =
SELECTEDVALUE( Product[Category], "All Categories" )
RETURN
"Sales for " & SelectedCategory & " in " & SelectedYear
Step 2 — Select the chart, open the Format pane, and find Title.
Step 3 — Turn on the fx (conditional formatting) button next to Title Text.
Step 4 — Choose "Field value" and select the Chart Title measure.
Step 5 — Test by changing the slicer. The title updates to match the selection — "Sales for Electronics in 2025", and so on.
Write 12 DAX measures on a small Sales model
This is the exercise interviewers use most often. Below is a small star schema with four tables. Write each measure on top of it — the table shows the measure, the explanation, and the expected result pattern.
| Table | Type | Columns |
|---|---|---|
| Sales | Fact | SaleID, DateKey, ProductKey, CustomerKey, Qty, Price, Discount |
| Product | Dimension | ProductKey, ProductName, Category, SubCategory, Color |
| Customer | Dimension | CustomerKey, CustomerName, Email, Region, Segment |
| Date | Dimension | Date, DateKey, Year, Quarter, Month, MonthName, Weekday |
M01 Total Sales +
Total Sales =
SUMX(
Sales,
Sales[Qty] * Sales[Price] * ( 1 - Sales[Discount] )
)
Why SUMX: the line total does not exist as a column. SUMX iterates Sales and computes the expression row by row.
Expected result: a currency value per filter context. In a matrix by Category, each cell shows that category's sales; the grand total is the model total.
M02 Sales LY (SAMEPERIODLASTYEAR) +
Sales LY =
CALCULATE(
[Total Sales],
SAMEPERIODLASTYEAR( 'Date'[Date] )
)
Why CALCULATE: you need to shift the date filter for the base measure. CALCULATE modifies the filter context so the same period one year earlier is used.
Requires: a marked date table with a relationship to Sales.
Expected result: the same period one year earlier. In a matrix by Year, the 2025 column shows the value that the 2024 column shows in the Total Sales measure.
M03 YoY % +
YoY % =
DIVIDE(
[Total Sales] - [Sales LY],
[Sales LY]
)
Why DIVIDE: it returns BLANK instead of an error when the denominator is zero. Never use the / operator in a ratio measure.
Expected result: a decimal that formats as a percentage. Positive means growth over last year, negative means a drop, blank means there is no prior-year data.
M04 Sales YTD (TOTALYTD) +
Sales YTD =
TOTALYTD(
[Total Sales],
'Date'[Date]
)
What it does: returns the cumulative total from the start of the year to the last date in the current filter context.
Expected result: by month, the value grows through the year and resets in January. In December it equals the full year's sales.
M05 Running total +
Running Total =
CALCULATE(
[Total Sales],
FILTER(
ALL( 'Date'[Date] ),
'Date'[Date] <= MAX( 'Date'[Date] )
)
)
How it works: remove all date filters with ALL, then re-apply a filter that keeps every date up to and including the current date. The base measure sums across that window.
Expected result: a cumulative line that grows through the year. It resets at the start of each year if you put Year in the visual's rows.
M06 % of total (ALL and ALLSELECTED) +
% of All =
DIVIDE(
[Total Sales],
CALCULATE( [Total Sales], REMOVEFILTERS( Product ) )
)
% of Selected =
DIVIDE(
[Total Sales],
CALCULATE( [Total Sales], ALLSELECTED( Product ) )
)
When to use which: use % of All when the
denominator should always be the model total. Use
% of Selected when the denominator should be
the total of what the user has filtered — so percentages add
to 100% within the visible selection.
Expected result: a decimal that formats as a
percentage. For % of Selected, the values sum
to 100% in the visible rows.
M07 Product rank (RANKX) +
Product Rank =
RANKX(
ALL( Product[ProductName] ),
[Total Sales],
,
DESC,
DENSE
)
Why ALL: RANKX must iterate every product, not only the products in the current filter. ALL removes the filter so all product names are considered.
Why DENSE: DENSE gives ties the same rank and no gaps — two products tied at rank 3 means the next is rank 4, not rank 5.
Expected result: a whole number, 1 for the highest- selling product in the filter context.
M08 Distinct customers +
Distinct Customers =
DISTINCTCOUNT( Sales[CustomerKey] )
Why DISTINCTCOUNT: a customer may place many orders. SUM or COUNT would count rows; DISTINCTCOUNT counts unique customers.
Expected result: a whole number. In a region-level visual it is the number of unique customers per region.
M09 Average order value +
Average Order Value =
DIVIDE(
[Total Sales],
DISTINCTCOUNT( Sales[SaleID] )
)
Why DIVIDE: safe division — if there are no orders in the filter, the measure returns BLANK instead of an error.
Expected result: a currency value. Across all sales, it is total sales divided by the number of distinct orders. In a category-level visual, it is that category's average order value.
M10 Sales for Red products (CALCULATE with filters) +
Sales Red =
CALCULATE(
[Total Sales],
Product[Color] = "Red"
)
What CALCULATE does: takes the current filter context and adds a filter on Product[Color].
Expected result: a currency value for Red products only. It is unaffected by a page colour slicer — the measure always shows Red, no matter what the user selects.
M11 Top 5 products (TOPN) +
Top 5 Products =
VAR Top5 =
TOPN(
5,
ALL( Product[ProductName] ),
[Total Sales],
DESC
)
RETURN
CALCULATE( [Total Sales], Top5 )
How it works: TOPN returns a table of the top five product names by Total Sales. CALCULATE then restricts the base measure to those products.
Expected result: a currency value that equals the combined sales of the top five products. In a card visual it shows a single number; in a table visual it shows the contribution per product.
M12 Dynamic title with SELECTEDVALUE +
Dynamic Title =
VAR SelectedYear =
SELECTEDVALUE( 'Date'[Year], "All Years" )
VAR SelectedCategory =
SELECTEDVALUE( Product[Category], "All Categories" )
RETURN
"Sales for " & SelectedCategory & " in " & SelectedYear
How to wire it up: in the Format pane for the visual title, turn on fx and select "Field value" → Dynamic Title measure.
Expected result: the title changes with the slicers — "Sales for Electronics in 2025". If no filter is selected, the fallback text appears — "Sales for All Categories in All Years".
Power BI cheat table — 15 one-line reminders
Skim this on the morning of your interview. One line per topic, exactly enough to trigger a fuller answer.
| Topic | One-line reminder |
|---|---|
| Power BI components | Desktop for authoring, Service for sharing and refresh, Mobile for viewing, Gateway for on-premises data. |
| Import vs DirectQuery | Import copies data and is fast; DirectQuery queries the source and is fresh. |
| Star schema | One fact table, flat dimension tables around it. Preferred for Power BI. |
| Relationship cardinality | One-to-many from dimension to fact. Avoid many-to-many unless modelled with a bridge table. |
| Cross-filter direction | Single direction by default. Use bidirectional only when the model needs it and the performance cost is understood. |
| Calculated column vs measure | Column is stored and sliced; measure is aggregated in filter context. |
| Row context vs filter context | Row context = current row; filter context = filters applied to the data. |
| Context transition | CALCULATE inside a row context converts that row into a filter. |
| CALCULATE | Evaluates an expression in a modified filter context. The most important DAX function. |
| FILTER vs CALCULATETABLE | FILTER returns rows matching a condition; CALCULATETABLE evaluates a table expression in a modified context. |
| ALL vs ALLSELECTED | ALL removes filters; ALLSELECTED respects the user's selection outside the visual. |
| Time intelligence | TOTALYTD, SAMEPERIODLASTYEAR, DATEADD, PARALLELPERIOD. Requires a marked date table. |
| Variables (VAR / RETURN) | Named intermediate results. Improve readability and avoid recomputation. |
| Row-level security | Static roles filter by fixed values; dynamic roles filter by USERPRINCIPALNAME(). |
| Incremental refresh | RangeStart and RangeEnd parameters in Power Query. Loads only new or changed rows. |
| Performance Analyzer | Records visual render time, split into DAX and visual display. Use it before optimising. |
| Bookmarks | Capture filter, slicer and visibility state for one-click restore. |
| Drill-down vs drill-through | Drill-down moves through hierarchy in the same visual; drill-through opens a new page filtered to the item. |
| Sync slicers | Same slicer on multiple pages, staying in sync. Configured in View → Sync slicers. |
| Deployment pipeline | Dev → Test → Production workspaces with rules per stage. Needs Premium or Fabric capacity. |
How to prepare for a Power BI interview in 7 days
If your interview is next week, follow this plan. Each day has one focus and one practice task. Do not just read — open Power BI Desktop and build.
| Day | Focus | Practice task |
|---|---|---|
| Day 1 | Power BI ecosystem and basics | Answer Q1–Q5 out loud. Install Power BI Desktop. Connect to a CSV, load it, and confirm the table appears in the model. |
| Day 2 | Power Query and data preparation | Answer Q2, Q16–Q19. In Power Query, rename columns, change types, remove duplicates, and unpivot a wide table. |
| Day 3 | Data modelling | Answer Q4, Q5, Q9, Q30. Build a small star schema — one fact, three dimensions, a date table, one-to-many relationships. |
| Day 4 | DAX fundamentals | Answer Q6–Q8, Q20. Write Total Sales, Sales LY, YoY %, and Sales YTD on your model. |
| Day 5 | Advanced DAX | Write the running total, % of All, % of Selected, Product Rank and Top 5 Products measures. |
| Day 6 | Report design and security | Build a report with slicers, drill-through, bookmarks and a dynamic title. Set up one RLS role and test with View as role. |
| Day 7 | Mock interview and revision | Answer one scenario question per level out loud. Re-do the 12-measure DAX round without looking. Revise the cheat table. |
Common mistakes candidates make in Power BI interviews
Confusing calculated columns and measures
Saying "a calculated column is calculated at run time" is a red flag. Columns are stored in the model and computed at refresh; measures are computed at query time in filter context.
Mixing up ALL and ALLSELECTED
These give different percentage results. If the interviewer asks about "share of total", clarify whether you mean share of everything (ALL) or share of the current selection (ALLSELECTED).
Using bidirectional filters everywhere
Bidirectional relationships can cause ambiguous filter paths, wrong results and slow queries. Explain why you are using single-direction where possible.
Not marking the date table
Time intelligence functions like TOTALYTD and SAMEPERIODLASTYEAR need a marked date table. Mention the marking step — many candidates forget it.
Skipping performance thinking
When asked about a slow report, do not answer "add indexes" or "clean the data". Say "measure with the Performance Analyzer first" — that is the professional answer.
Ignoring RLS in the answer
For any enterprise role, RLS is expected. Mention dynamic RLS with USERPRINCIPALNAME() and a user mapping table, not just static roles.
Practise these topics with Uncodemy
SQL, Excel, Power BI, Python and dashboard design are taught inside Uncodemy's Data Analytics with Gen AI program. Power BI is also covered in the Business Analyst and Data Science programs, and a short standalone Power BI course is available for learners who only want the reporting tool.
| Program | What it covers | Duration / fee |
|---|---|---|
| Data Analytics with Gen AI | SQL & database management (18 h), Excel (12 h), Power BI (18 h), Python (20 h), plus Gen AI usage for analytics. The main path for Power BI interview preparation. | ₹17,500 + GST · 6–7 months |
| Business Analyst | SQL for BAs (15 h), Excel (12 h), Power BI (15 h), BRD/FRD, process modelling, Agile/Scrum, JIRA and stakeholder management. | ₹17,500 + GST · 6–7 months |
| Data Science | SQL, Excel, Power BI module, Python for Data Science, statistics, machine learning, deep learning, NLP, 7 projects. | ₹21,500 + GST · 8–9 months |
| Power BI (short course) | 30+ hours, 15+ sessions, 2 modules listed. Useful as a short add-on if you already know SQL and Excel. | Ask a counsellor for current batch details. |
Placement assistance (as published by Uncodemy): resume building, LinkedIn optimisation, portfolio review, interview preparation, mock interviews and opportunity sharing through a network of 850+ companies. Uncodemy does not guarantee employment, as hiring decisions rest with employers. See placement support.
Also useful: AI career guidance for picking between analytics, BI and data science roles, and the 2-class free trial to see how a live batch runs before you commit.