Tableau Interview Questions and Answers: 60 Questions from Easy to Hard
This guide is for freshers and working analysts in India preparing for a Tableau round, whether the job title says data analyst, BI developer, MIS executive or reporting analyst. It has 60 questions in three levels: the basics every fresher is asked (dimensions and measures, discrete and continuous, live and extract), then the day-to-day work of an analyst with one to four years (LOD expressions, table calculations, filters, parameters and sets), and finally senior topics such as the order of operations, performance, row-level security and dashboard design. Answers follow Tableau Desktop 2024.x, and the calculations come with a small table so you can check every number by hand. Rebuild each one in Tableau Public before you read the answer, then take the mock test.
- 60 questions, 3 levels
- Updated
- CoreHRx Jobs
- 955 open Tableau jobs
What Tableau interviews cover
- Data basics: dimensions and measures, discrete and continuous fields, aggregation and the level of detail of a view. Almost every round starts here.
- Connections and data modelling: live connections versus extracts, joins, unions, relationships and data blending, and how each one changes the numbers.
- Calculations: calculated fields, LOD expressions (FIXED, INCLUDE, EXCLUDE) and table calculations with the right Compute Using setting.
- Filters and the order of operations: context filters, Top N, parameters and sets, and why a result changes when a filter moves.
- Dashboards and sharing: choosing charts, dual axis, dashboard actions, performance and publishing to Tableau Server or Tableau Cloud.
How to prepare (freshers and experienced)
- Freshers: build one complete sales dashboard in the free Tableau Public app on a sample orders dataset, with KPI tiles, a monthly trend, a map and a top 10 table. Remember that anything saved to Tableau Public is visible to everyone.
- Practise every calculation on a small table you can check by hand, so you can explain why a number is what it is, not just where to click.
- Learn the order of operations and test it yourself: add a Top N filter and a category filter, then add the category filter to context and watch the result change.
- Experienced analysts: prepare two stories from your work, such as a slow dashboard you made faster or a figure you reconciled with finance, with the before and after numbers.
- Keep two or three dashboards on Tableau Public built on public data, each with a one-line note on the business question it answers.
Common mistakes and interview-day tips
- Do not say blue means dimension and green means measure. Blue and green show discrete and continuous, which is a separate idea.
- State the level of detail before giving a number: average sales per order and average sales per customer are different answers.
- When asked to calculate something, say whether you would use a basic calculation, an LOD expression or a table calculation, and why.
- In a live task, check one total against a known figure before you polish colours; a wrong number in a good-looking dashboard fails the round.
- If you have not used a feature, such as Tableau Server administration, say so and explain how you would approach it instead of guessing.
Tableau interview questions: Easy questions (freshers)
20 questions1. What is the difference between a dimension and a measure in Tableau?
A dimension is a qualitative field you slice by, such as Region, Category, Customer Name or Order Date. A measure is a quantitative field that Tableau aggregates, such as Sales, Profit or Quantity, summed by default. Dimensions set the level of detail of the view: Region on Rows gives one row per region, and SUM(Sales) is then worked out per region. A number is not always a measure: Postal Code or Employee ID should be dimensions, because adding them up means nothing.
2. What is the difference between discrete and continuous fields?
Discrete fields, shown as blue pills, have separate values and draw headers. Continuous fields, shown as green pills, form an unbroken range and draw an axis. This is independent of dimension and measure: SUM(Sales) can be made discrete to show values as headers, and a dimension such as Order Date can be continuous. A continuous date gives a timeline axis, while discrete date parts give one header per year or month. Right-click a pill and choose Discrete or Continuous to switch. A common mistake is saying blue means dimension.
3. What is the difference between a live connection and an extract?
A live connection sends a query to the source database every time the view changes, so the data is always current, but speed depends on that database and the network. An extract is a compressed snapshot saved in a .hyper file and queried by the Hyper engine; it is usually faster, works offline and takes load off a busy production database, but it is only as fresh as its last refresh. Use live when minute-level freshness matters and the database is fast. A common mistake is publishing an extract and never scheduling its refresh.
4. What is the difference between .twb, .twbx, .hyper, .tds and .tdsx files?
A .twb is the workbook in XML: sheets, dashboards, calculations and connection details, but no data, so the person opening it needs access to the source. A .twbx is a packaged workbook, the .twb zipped together with extracts and local files such as Excel sheets or images, which is what you send to someone without access. A .hyper file is an extract. A .tds saves a data source definition (connection, calculated fields, aliases) without data, and a .tdsx packages it with its extract. Emailing a .twb by mistake is a classic error.
5. What decides how many marks a view has, and what does the Detail shelf do?
The dimensions in the view decide its level of detail: Tableau draws one mark for every combination of their values that exists in the data. With 4 regions on Rows and 3 categories on Columns there can be at most 12 marks, but if the West region never sold Furniture you see 11. Measures do not add marks; they are aggregated per mark. Putting a dimension on Detail adds it to the level of detail without drawing headers, so a scatter plot of Sales and Profit with Customer on Detail shows one dot per customer. The status bar shows the mark count.
6. How does Tableau aggregate measures, and what does an asterisk (*) in a view mean?
Measures are aggregated to the level of detail of the view, with SUM by default; the pill menu changes it to AVG, MIN, MAX, COUNT, COUNTD, MEDIAN and others. A dimension placed on Tooltip or Label is shown as ATTR, which returns the value when every row behind the mark has the same value and an asterisk when it has several. So a tooltip showing * for Manager means more than one manager sits behind that mark, usually because the view is coarser than you think or a join brought in extra rows. Add the field to the view or check the data.
7. How do you calculate a correct profit ratio in Tableau?
Divide total profit by total sales, with the aggregation written inside the calculated field. For these three orders that gives 200 / 2,000 = 10%. If you write Profit divided by Sales without aggregation, Tableau computes a ratio per row, and when you drag it into the view it sums those ratios to 45%. Even AVG gives 15%, because a small order with a high margin counts as much as a big one. An aggregate calculation is evaluated after aggregation, so it stays right at any level: region, month or grand total.
Order Sales Profit
A101 1000 100
A102 200 60
A103 800 40
// Correct: aggregate first, then divide
[Profit Ratio]
SUM([Profit]) / SUM([Sales])
// Wrong: ratio per row, then summed in the view
[Row Ratio]
[Profit] / [Sales]8. What kinds of filters does Tableau have, and in what order do they apply?
From earliest to latest: extract filters limit what goes into an extract; data source filters apply to every sheet that uses the data source; context filters create a smaller working set that later filters use; dimension filters act like a SQL WHERE on dimension values; measure filters act like HAVING on aggregated values; and table calculation filters only hide marks after the calculation. The order matters: a Top N filter or a FIXED calculation ignores a normal dimension filter unless that filter is added to context.
9. What is the difference between a join and a union in Tableau?
A join puts tables side by side, matching rows on a key such as Customer ID, so you get more columns. Tableau offers inner, left, right and full outer joins: an inner join keeps only matching rows, a left join keeps every row of the left table. A union stacks tables that have the same columns, so you get more rows, for example the January, February and March sheets of one Excel file. Tableau adds a Table Name column showing where each row came from. Joining monthly files that should have been unioned is a common mistake.
10. What is a relationship in Tableau, and how is it different from a join?
A relationship, drawn as a line (often called a noodle) between logical tables on the data source page in Tableau 2020.2 and later, tells Tableau how two tables match without merging them. At query time Tableau uses only the tables the sheet needs and aggregates each table at its own level of detail. A join, made in the physical layer by double-clicking a logical table, merges the tables into one flat table first, which can duplicate rows when the tables have different grain. For new work, relate tables, and join only when you really need one merged table.
11. What is the difference between a group, a set and a hierarchy?
A group combines dimension members into a higher category, for example Chennai, Coimbatore and Madurai into one group called Tamil Nadu, and it changes only when you edit it. A set is a subset with two values, In and Out, defined by picking members or by a rule such as sales above Rs 10 lakh or the top 10 by profit, so its members can change with the data; sets can be combined and changed by set actions. A hierarchy such as Category, Sub-Category and Product lets users drill down and up with the plus and minus icons.
12. What is a parameter, and how is it used?
A parameter is a single workbook-wide value, such as a number, date or string, that a user changes through a parameter control. On its own it does nothing: you must use it in a calculated field, a Top N filter, a reference line or a bin size. For example, a Top N parameter from 5 to 20 lets a manager in Hyderabad see the top 5 or top 20 products. Unlike a filter it is not tied to one field, although its list of values can refresh from a field when the workbook opens. A common mistake is creating it and forgetting to show the control or use it.
13. Which chart would you choose to compare categories, show a trend, show a relationship and show geography?
Use a bar chart to compare categories, sorted so the largest comes first, because lengths are easy to compare. Use a line chart on a continuous date to show a trend, such as monthly sales. Use a scatter plot for the relationship between two measures, like discount against profit per product. Use a map when location matters, for state or city sales, once the field has a geographic role. A highlight table suits quick lookups across two dimensions. Avoid pie charts with many slices; angles are hard to compare.
14. What is the difference between a date part and a date value in Tableau?
A date part such as MONTH of Order Date, used discrete, ignores the year, so January 2023 and January 2024 fall under one January header: 100 + 150 = 250, and February 120 + 140 = 260. A date value, a date truncated to the month and used continuous, keeps the year, so you get four separate points on a timeline. Use date parts to compare seasons and date values to show a trend. In the pill menu, the upper list of Year, Quarter, Month and Day gives date parts and the lower list gives date values.
Month Sales
2023-01 100
2023-02 120
2024-01 150
2024-02 140
MONTH([Order Date]) date part, discrete: Jan, Feb
DATETRUNC('month', [Order Date])
date value, continuous: 4 points15. What are Measure Names and Measure Values, and when do you use them?
Measure Values is a generated field that holds the values of several measures, and Measure Names holds their names. Together they show several measures in one view: a text table with Sales, Profit and Quantity as columns, or several measures on one shared axis. Drag Measure Values to Text and Measure Names to Columns, then choose which measures appear on the Measure Values card. Dropping a second measure onto an existing axis builds this shared axis automatically. The catch is that the measures share one marks card, so they get the same mark type.
16. What is a dashboard in Tableau, and how do tiled, floating and containers work?
A dashboard places several sheets, filters, legends, text, images and web content on one page. Objects are tiled, in a grid where nothing overlaps, or floating, on top at an exact position. Horizontal and vertical containers group objects so they resize together. Size can be Fixed, Automatic or a Range; a fixed size such as 1366 x 768 looks the same everywhere, while Automatic adapts to the window but can squeeze the layout. Device layouts let you design a separate phone version. Too many sheets on one dashboard is a common cause of slow loading.
17. What are dashboard actions, and which types are there?
Actions make one part of a dashboard respond to the user. A filter action uses the marks selected in a source sheet to filter target sheets, for example clicking Maharashtra on a map to filter a product table. A highlight action highlights related marks without removing the others. Other types are URL actions, Go to Sheet, Change Parameter and Change Set Values. Each action can run on Select, Hover or Menu. The quickest start is the Use as Filter icon on a sheet in the dashboard, which creates a filter action for you.
18. How do you sort a view and show only the top 10 products by sales?
Use the sort buttons on the toolbar or axis, or right-click the dimension and choose Sort, which offers data source order, alphabetic, by field (for example SUM of Sales descending), manual and nested. For the top 10, drag Product to Filters, open the Top tab and choose top 10 by sum of Sales; a parameter for N lets users pick 5, 10 or 20. A Top N filter is calculated before ordinary dimension filters, so if you also filter on Region, add that filter to context, or the top 10 is picked across all regions first.
19. How does Tableau treat nulls, and what do ZN, IFNULL and ISNULL do?
Aggregations skip nulls, so AVG of 100, null and 200 is 150, not 100. If a null target really means zero, wrap the field in ZN, which turns nulls into 0, and the average becomes 100. IFNULL replaces a null with a value you choose, such as Unknown for a missing city, and ISNULL returns true or false so you can count or filter missing values. Decide with the business what a null means before replacing it: a missing discount may be zero, but a missing delivery date means the order is not delivered yet.
Month Target
Jan 100
Feb null
Mar 200
AVG([Target]) // nulls skipped
AVG(ZN([Target])) // null becomes 0
IFNULL([City], 'Unknown')
ISNULL([Delivery Date]) // True or False20. What are Tableau Desktop, Prep, Server, Cloud and Public used for?
Tableau Desktop is the authoring tool where you connect to data and build workbooks. Tableau Prep Builder cleans and reshapes data in flows. Tableau Server is the platform a company installs and runs itself to share dashboards with permissions, refresh schedules and subscriptions; Tableau Cloud, formerly Tableau Online, is the same idea hosted by Tableau. Tableau Public is free, but everything published to it is visible to anyone, so never put company or customer data there. In an interview, say which ones you have used and for what.
Ready to check yourself? Take the free Tableau mock test
Tableau interview questions: Medium questions (1-3 years)
20 questions21. When do you use a relationship, a join and a data blend?
Use a relationship by default when the tables are in one data source, especially when their grain differs, such as order lines and regional targets: Tableau keeps each table at its own level and queries only what the sheet needs. Use a join when you need one merged table, for example a row-level calculation that uses columns from both tables. Use blending when the data comes from separate data sources that cannot be related, such as two published data sources: the secondary source is aggregated and matched on linking fields, sheet by sheet. Blending is the most limited of the three.
22. After joining Orders to a Targets table on Region, the targets look too high. Why, and how do you fix it?
The join copies the region target onto every order row, so SUM(Target) counts it once per order. North has 3 orders, so its target of Rs 2,00,000 shows as Rs 6,00,000 and attainment falls from 75% to 25%. This is fan-out from joining tables of different grain. Fix it by relating Targets to Orders on Region instead of joining; Tableau then aggregates targets at their own level. If the join must stay, use MIN or AVG of Target per region instead of SUM. Compare row counts before and after every join.
Orders
Region Order Sales
North N1 50000
North N2 70000
North N3 30000
South S1 90000
South S2 60000
Targets
Region Target
North 200000
South 120000
After a join on Region:
Region SUM(Sales) SUM(Target)
North 150000 600000
South 150000 24000023. Your table shows average sales per region, but the grand total is not the average of the region values. Why?
Totals are Automatic by default: Tableau computes the total from the underlying rows at the total level, not from the numbers shown. With AVG(Sales), the regions show 833.33, 525.00 and 1,200.00, and the grand total is the average of all 9 orders, 777.78, while the average of the three region values is 852.78. Both are correct answers to different questions. Analysis, Totals, Total All Using switches to the Sum, Average, Minimum or Maximum of the displayed values. In the same way, a COUNTD total counts distinct values over everything.
Region Customer Sales
North Aarav 1200
North Aarav 800
North Diya 500
South Kabir 900
South Meera 300
South Meera 600
South Meera 300
West Rohan 2000
West Sneha 400
AVG([Sales]) by Region
Region AVG(Sales)
North 833.33
South 525.00
West 1,200.0024. How do you find each customer's first purchase month and build cohorts?
Use a FIXED expression for the earliest order date per customer, whatever is in the view, then truncate it to the month and use it as a dimension. Here Aarav and Diya first bought in January, Kabir in February and Meera and Rohan in March, so the cohorts have 2, 1 and 2 customers. Put the cohort on Rows and order month on Columns: in March the January cohort spent Rs 300, the February cohort Rs 800 and the March cohort Rs 1,650. A normal filter on March does not change anyone's first month.
Order Customer Order Date Sales
O1 Aarav 2024-01-05 1500
O2 Diya 2024-01-18 700
O3 Aarav 2024-02-02 900
O4 Kabir 2024-02-11 1200
O5 Diya 2024-02-25 400
O6 Meera 2024-03-03 650
O7 Aarav 2024-03-09 300
O8 Kabir 2024-03-21 800
O9 Rohan 2024-03-28 1000
[First Order Date]
{FIXED [Customer] : MIN([Order Date])}
[Cohort Month]
DATETRUNC('month', [First Order Date])25. AVG(Sales) by region gives a smaller number than the average sales per customer. Why, and how does INCLUDE help?
AVG(Sales) averages order rows, not customers. In North, orders of 1,200, 800 and 500 average 833.33, but Aarav bought 2,000 in total and Diya 500, so the average per customer is 1,250. INCLUDE adds Customer to the level of detail of the view, sums sales per region and customer, and the AVG in the view then averages those totals: 1,250 for North, 1,050 for South and 1,200 for West. INCLUDE respects dimension filters and adapts when you add another dimension to the view.
Region Customer Sales
North Aarav 1200
North Aarav 800
North Diya 500
South Kabir 900
South Meera 300
South Meera 600
South Meera 300
West Rohan 2000
West Sneha 400
// Average of customer totals, per region
AVG({INCLUDE [Customer] : SUM([Sales])})26. How do you show each customer's share of their region's sales with EXCLUDE?
With Region and Customer on Rows, EXCLUDE removes Customer from the level of detail, so the expression returns the region total on every customer row. Dividing SUM(Sales) by it gives each share: Aarav 80.0% and Diya 20.0% of North's 2,500, Kabir 42.9% and Meera 57.1% of South's 2,100. MIN wraps the expression because the value is the same on every row of the mark. A Percent of Total table calculation along Customer gives the same numbers, but EXCLUDE can also be reused in other calculations.
// View: Region and Customer on Rows
[Share of Region]
SUM([Sales])
/ MIN({EXCLUDE [Customer] : SUM([Sales])})
Region Customer SUM(Sales)
North Aarav 2000
North Diya 500
South Kabir 900
South Meera 120027. A FIXED calculation ignores the Category filter on your sheet. Why, and how do you make it respect the filter?
FIXED expressions are computed after context filters but before ordinary dimension filters, so a normal Category filter does not reach them. With Category set to Furniture, SUM(Sales) shows North 400 and South 300, but the FIXED region total still shows 1,200 and 1,000, so Furniture is 33.3% and 30.0% of sales. If the total should follow the filter, right-click it and choose Add to Context: the FIXED values become 400 and 300. INCLUDE and EXCLUDE run after dimension filters, so they respect them.
Region Category Sales
North Furniture 400
North Technology 600
North Office Supplies 200
South Furniture 300
South Technology 200
South Office Supplies 500
// Filter: Category = Furniture
[Region Total]
{FIXED [Region] : SUM([Sales])}
[Furniture Share]
SUM([Sales]) / MIN([Region Total])28. Your running total keeps adding into the next year. How do you make it restart every year?
A running total moves along its addressing fields and restarts for each partition. With Year and Month on Columns, the default Table (across) carries on into 2024, so January 2024 shows 630 instead of 130. Edit the table calculation, choose Specific Dimensions and tick only Month: Month becomes the addressing field and Year the partition, so the total restarts each year, giving 120, 270, 360 and 500 for 2023 and 130, 290, 400 and 570 for 2024. Pane (across) would also work here, but Specific Dimensions survives layout changes.
Sales in Rs thousand
Year Month Sales
2023 Jan 120
2023 Feb 150
2023 Mar 90
2023 Apr 140
2024 Jan 130
2024 Feb 160
2024 Mar 110
2024 Apr 170
RUNNING_SUM(SUM([Sales]))
Compute Using > Specific Dimensions:
[x] Month of Order Date (addressing)
[ ] Year of Order Date (partition, restarts)29. How do you calculate year-over-year sales growth in a view?
Use a table calculation that compares each year with the one before it, using LOOKUP with an offset of -1 along Year. With yearly sales of Rs 4,00,000, Rs 4,60,000, Rs 5,06,000 and Rs 4,80,700, growth is 15.0%, 10.0% and -5.0%; the first year is null because it has no previous year. The quick table calculation Percent Difference does the same. Two mistakes: computing along the wrong field when Region is also in the view (compute using Year, so each region is a partition), and filtering out 2021, which makes 2022's growth null because the table calculation no longer sees 2021.
Year Sales
2021 4,00,000
2022 4,60,000
2023 5,06,000
2024 4,80,700
[YoY Growth] // Compute Using: Year of Order Date
(SUM([Sales]) - LOOKUP(SUM([Sales]), -1))
/ ABS(LOOKUP(SUM([Sales]), -1))30. What is the difference between RANK, RANK_DENSE, RANK_MODIFIED and RANK_UNIQUE?
RANK is competition ranking: ties share a rank and the next rank is skipped, so 900, 750, 750 and 600 become 1, 2, 2 and 4. RANK_DENSE does not skip: 1, 2, 2 and 3. RANK_MODIFIED gives tied values the lower position: 1, 3, 3 and 4. RANK_UNIQUE gives every row its own rank, 1, 2, 3 and 4, breaking ties by row order. All rank in descending order by default; pass asc for ascending. As table calculations they need the right Compute Using: to rank reps within each region, compute using Rep so every region is ranked separately.
Rep Sales RANK RANK_DENSE RANK_MODIFIED RANK_UNIQUE
Anil 900 1 1 1 1
Bhavna 750 2 2 3 2
Chetan 750 2 2 3 3
Deepa 600 4 3 4 4
RANK(SUM([Sales])) // 'desc' is the default
RANK_DENSE(SUM([Sales]), 'desc')31. Your percent-of-total numbers change when a user filters out a category. How do you control that?
A Percent of Total table calculation divides each value by the total of what is left in the view, so it changes with filters. With Furniture Rs 3,00,000, Technology Rs 5,00,000 and Office Supplies Rs 2,00,000, the shares are 30%, 50% and 20%. Filter out Office Supplies and the table calculation shows 37.5% and 62.5%. If the share must stay against the full total, divide by a table-scoped FIXED total, which ignores dimension filters and keeps 30% and 50%. Ask the user which one they mean.
Category Sales
Furniture 3,00,000
Technology 5,00,000
Office Supplies 2,00,000
// Table calculation: total of what is left in the view
SUM([Sales]) / TOTAL(SUM([Sales]))
// FIXED: total of all categories, ignores dimension filters
SUM([Sales]) / MIN({FIXED : SUM([Sales])})32. A Top 2 cities filter combined with a Category filter shows only one city. What is happening?
A Top N filter is evaluated before ordinary dimension filters. Tableau first picks the top 2 cities across all categories, Mumbai and Delhi, and only then applies Category = Furniture. Delhi has no furniture sales, so only Mumbai is left, with 100. Add the Category filter to context (it turns grey on the Filters shelf) and Tableau ranks within furniture, giving Pune (500) and Chennai (450). Context filters run before sets, Top N filters and FIXED calculations, which run before dimension filters.
City Category Sales
Mumbai Technology 900
Mumbai Furniture 100
Delhi Technology 650
Delhi Office Supplies 300
Pune Furniture 500
Pune Technology 200
Chennai Furniture 450
Chennai Office Supplies 150
Filters: City (Top 2 by SUM(Sales))
Category = Furniture33. How do you let users switch a chart between Sales, Profit and Quantity?
Create a string parameter with the values Sales, Profit and Quantity, show its control, and write a calculated field with CASE that returns the matching aggregate. Put that field on Rows instead of a fixed measure. Because every branch is aggregated, the calculation works at any level of detail. Show the chosen name in the sheet title by inserting the parameter. Watch two things: the parameter values must match the CASE strings exactly, including spaces, and the field has one number format, so a rupee format looks odd on Quantity; format inside tooltips or labels.
// [Choose Measure]: string parameter
// list: Sales, Profit, Quantity
[Selected Measure]
CASE [Choose Measure]
WHEN 'Sales' THEN SUM([Sales])
WHEN 'Profit' THEN SUM([Profit])
WHEN 'Quantity' THEN SUM([Quantity])
END34. How would you show the top 10 customers by name and group everyone else as Others?
Create a dynamic set on Customer Name using the Top tab, top 10 by SUM(Sales). Then write a calculated field that returns the customer name when the customer is in the set and Others otherwise, and use that field in the view, sorted by sales. Because the set is computed from the data, the list updates after every refresh. Sets are worked out after context filters and before dimension filters, so add a region filter to context if the top 10 should be per region. A set action can let a click add a customer to the set to show that customer separately.
// [Top 10 Customers]: set, Top 10 by SUM([Sales])
[Customer Group]
IF [Top 10 Customers] THEN [Customer Name]
ELSE 'Others'
END35. How do you build a dual-axis chart, and what should you watch out for?
Put two measures on Rows, then right-click the second pill and choose Dual Axis, or drag it to the right edge of the view. Each measure keeps its own marks card, so monthly Sales can be bars and Profit Ratio a line. Watch the scales: the two axes are independent, which can mislead, so use Synchronize Axis when both measures share a unit (it is greyed out when their data types differ, so change one to a decimal). Label both axes when the units differ. If both measures use the same unit and mark type, a shared axis with Measure Values is simpler.
36. Clicking a region on a sales dashboard map should filter the product table and trend line. How do you set it up?
Add a filter action (Dashboard, Actions, Add Action, Filter) with the map as the source, run on Select, and the product table and trend sheets as targets. Under Target Filters choose Selected Fields and map Region to Region, so the action keeps working when fields are added to the map. Clearing the selection has three options: Keep filtered values, Show all values (the usual choice) and Exclude all values, which leaves a detail table empty until something is selected. Leave the map itself out of the targets, or a click filters the map too.
37. What is the difference between a full and an incremental extract refresh, and when can incremental give wrong data?
A full refresh rebuilds the extract from the source. An incremental refresh adds only rows whose value in a chosen column, such as Order Date or an increasing Order ID, is beyond the highest value already in the extract, which is much faster on large tables. It never sees rows that were changed or deleted after loading, so if a Pune retailer updates old orders when goods are returned, those changes are missed. Use incremental refresh for append-only data and schedule a periodic full refresh, for example weekly. Extract filters and hiding unused fields also keep extracts small.
38. What does the error "Cannot mix aggregate and non-aggregate arguments" mean, and how do you fix it?
One expression mixes a row-level field with an aggregate: Region has a value on each row, while SUM(Sales) has one value per mark, so Tableau cannot evaluate them together. Either make everything aggregate, for example ATTR or MIN of Region next to SUM of Sales, or make everything row-level and aggregate at the end, such as summing an IF that returns Sales only for North rows. Pick by the question: the first tests each mark, the second builds a conditional measure. A FIXED expression can be used in row-level logic because its result behaves like a row-level value.
// Error: Region is row-level, SUM is aggregate
IF [Region] = 'North' AND SUM([Sales]) > 100000
THEN 'Big North' END
// Fix 1: test each mark, all aggregate
IF ATTR([Region]) = 'North' AND SUM([Sales]) > 100000
THEN 'Big North' END
// Fix 2: row-level first, aggregate at the end
SUM(IF [Region] = 'North' THEN [Sales] END)39. How do DATEDIFF and DATETRUNC work, and what is the common mistake with DATEDIFF?
DATEDIFF counts how many boundaries of the chosen date part are crossed, not complete periods: from 31 January to 1 February 2024 is 1 day and also 1 month, and from 31 December 2023 to 1 January 2024 is 1 year. So DATEDIFF in years overstates age before the birthday: someone born on 15 December 2000 gets 24 on 1 June 2024, although they are 23. DATETRUNC moves a date back to the start of the part, so 17 May 2024 truncated to the quarter is 1 April 2024, which is how you group dates into periods inside calculations.
DATEDIFF('day', #2024-01-31#, #2024-02-01#) // 1
DATEDIFF('month', #2024-01-31#, #2024-02-01#) // 1
DATEDIFF('year', #2023-12-31#, #2024-01-01#) // 1
DATEDIFF('year', #2000-12-15#, #2024-06-01#) // 24
DATETRUNC('quarter', #2024-05-17#) // 2024-04-0140. What do you decide when you publish a workbook and its data to Tableau Server or Tableau Cloud?
First, embedded or published data source: an embedded source lives in one workbook, while a published data source is shared, so many workbooks reuse the same calculations and one extract refresh. Second, credentials: embed the password so schedules can refresh, or prompt users when each person must use their own login. Third, refresh: schedule extract refreshes, and on Tableau Cloud use Tableau Bridge when the database sits in a private network. Fourth, the project and its permissions. Include external files when the data is a local Excel or CSV file.
Ready to check yourself? Take the free Tableau mock test
Tableau interview questions: Hard questions (experienced)
20 questions41. Walk through Tableau's order of operations and how it explains surprising results.
Tableau processes a view in a fixed order: extract filters, data source filters, context filters, then FIXED calculations, sets and Top N or conditional filters, then ordinary dimension filters, then INCLUDE and EXCLUDE calculations, then measure filters. After the query returns come table calculations, table calculation filters, and finally reference and trend lines. Most surprises follow from this: a Top N ignoring a region filter, a FIXED share not moving with a filter, a running total restarting after a month filter. When a number looks wrong, I check at which step each filter runs.
42. How would you calculate the number of days between each customer's first and second purchase?
Find the first order date with a FIXED expression, then a nested FIXED that takes the earliest order date after that first date, and take DATEDIFF in days. Both results are per customer and behave like row-level values, so they can be reused in other calculations. Here Aarav took 28 days, Diya 38 and Kabir 39, while Meera and Rohan get null because they bought only once. To show the spread, convert the result to a discrete dimension and count distinct customers per value. A table calculation could find the gap too, but it depends on the view layout.
Order Customer Order Date Sales
O1 Aarav 2024-01-05 1500
O2 Diya 2024-01-18 700
O3 Aarav 2024-02-02 900
O4 Kabir 2024-02-11 1200
O5 Diya 2024-02-25 400
O6 Meera 2024-03-03 650
O7 Aarav 2024-03-09 300
O8 Kabir 2024-03-21 800
O9 Rohan 2024-03-28 1000
[First Order Date]
{FIXED [Customer] : MIN([Order Date])}
[Second Order Date]
{FIXED [Customer] : MIN(
IF [Order Date] > [First Order Date]
THEN [Order Date] END)}
[Days To Second Order]
DATEDIFF('day', [First Order Date], [Second Order Date])43. How do you build a histogram of how many orders each customer placed?
Count orders per customer with a FIXED expression on Customer, convert it to a discrete dimension and put it on Columns, with the distinct count of customers on Rows. Each bar then answers how many customers placed that many orders: here 2 customers ordered once, 2 ordered twice and 1 ordered three times. FIXED is needed because the order count must be computed per customer whatever the view shows; a plain COUNTD would count orders per bar instead. FIXED ignores dimension filters, so add a date filter to context if the histogram should cover only that period.
Order Customer Order Date Sales
O1 Aarav 2024-01-05 1500
O2 Diya 2024-01-18 700
O3 Aarav 2024-02-02 900
O4 Kabir 2024-02-11 1200
O5 Diya 2024-02-25 400
O6 Meera 2024-03-03 650
O7 Aarav 2024-03-09 300
O8 Kabir 2024-03-21 800
O9 Rohan 2024-03-28 1000
[Orders Per Customer] // convert to Dimension, Discrete
{FIXED [Customer] : COUNTD([Order ID])}
Columns: [Orders Per Customer]
Rows: COUNTD([Customer])
Orders per customer Customers
1 2
2 2
3 144. How do you count new and returning customers per month?
Flag every order as New when its month equals the customer's first order month, and Returning otherwise, using a FIXED first date inside a row-level IF. Then count distinct customers by order month and the flag. Here January has 2 new and 0 returning customers, February 1 new and 2 returning, and March 2 new and 2 returning. Because the first date comes from FIXED, a normal filter on March still knows that Aarav first bought in January. A context or data source filter on date would remove his earlier orders and wrongly make him new.
Order Customer Order Date Sales
O1 Aarav 2024-01-05 1500
O2 Diya 2024-01-18 700
O3 Aarav 2024-02-02 900
O4 Kabir 2024-02-11 1200
O5 Diya 2024-02-25 400
O6 Meera 2024-03-03 650
O7 Aarav 2024-03-09 300
O8 Kabir 2024-03-21 800
O9 Rohan 2024-03-28 1000
[Customer Type]
IF DATETRUNC('month', [Order Date])
= DATETRUNC('month', {FIXED [Customer] : MIN([Order Date])})
THEN 'New' ELSE 'Returning' END
Columns: MONTH([Order Date]) Color: [Customer Type]
Rows: COUNTD([Customer])45. How do you build a Pareto chart that shows which sub-categories make up 80% of sales?
Put Sub-Category on Columns sorted by SUM(Sales) descending, with sales as bars. Add a running sum of sales divided by the total, computed Table (across) so it follows the sorted order, and make it a dual-axis line formatted as a percentage. Here the cumulative share is 45%, 75%, 87%, 95%, 98% and 100%, so 3 of 6 sub-categories cover 80% of sales. A reference line at 80% makes the cut-off visible. The usual bug is a sort that is not descending, or a Compute Using along the wrong field, which attaches the percentages to the wrong bars.
Sub-Category Sales
Phones 450
Chairs 300
Binders 120
Tables 80
Paper 30
Art 20
[Cumulative Share] // Compute Using: Table (across)
RUNNING_SUM(SUM([Sales])) / TOTAL(SUM([Sales]))46. A dashboard takes 25 seconds to load on Tableau Server. How do you find the cause?
Measure before changing anything. In Tableau Desktop, start the Performance Recorder from Help, Settings and Performance, load the dashboard, stop it, and read the workbook it opens: it lists events such as executing query, computing layout, geocoding and rendering, with their times and sheets. If one query dominates, read its SQL for a slow join, custom SQL or a COUNTD over millions of rows. If layout or rendering dominates, there are too many marks or sheets. On Server, an admin can allow recording and you add :record_performance=yes to the view URL. Change one thing, then re-measure.
47. Which calculation and filter choices make a Tableau dashboard slow, and what do you use instead?
Quick filters set to Only Relevant Values send extra queries whenever another filter changes, and many quick filters on high-cardinality fields such as Customer Name each need their own query: use fewer filters, All Values in Database, an Apply button, or filter actions. String calculations are slower than numbers and booleans, so compare IDs rather than names and return booleans. COUNTD on large data is expensive. Context filters only help when they cut the data a lot, because they add a step. Thousands of marks, such as a huge crosstab, slow rendering.
48. You must build a dashboard on about 20 crore (200 million) order rows. How do you design the extract?
Bring in only what the dashboard needs. Hide unused fields and add extract filters, such as the last three years only. If the dashboard never shows single orders, use Aggregate data for visible dimensions and roll dates up to day, so rows collapse to one per day, product and store. Materialize heavy row-level calculations with Compute Calculations Now. Refresh incrementally on an increasing date or ID, with a weekly full refresh, scheduled off-peak. Keep order-level detail in a separate extract used only by drill-down sheets, so the main dashboard stays fast.
49. What do the performance options on a relationship do, and why can custom SQL make a data source slower?
A relationship has optional settings for cardinality, Many or One on each side, and referential integrity, Some records match or All records match. They are hints: stating One and All records match lets Tableau write simpler, faster queries, but if the hint is false you can get wrong or missing values, so set them only when the data guarantees it. Relationships also mean Tableau queries only the tables a sheet uses. Custom SQL is treated as one opaque subquery, so Tableau cannot leave parts out or simplify it; prefer tables or database views.
50. How do you implement row-level security so each regional manager sees only their region?
Keep an entitlement table that maps each user to the regions they may see, join it to the data on Region, and add a data source filter on a calculation that compares its username column with USERNAME(), set to True. Publish it as a data source: workbook authors who connect to it cannot remove that filter, so every dashboard on it is secured. Test as real users, since in Desktop USERNAME() returns your own login. Group rules with ISMEMBEROF can replace the table, but do not mix them with the joined table, or a user who passes the group test sees duplicated rows.
Entitlements (joined to Orders on Region)
Username Region
asha@example.com North
ravi@example.com South
ravi@example.com West
[RLS Allowed] // data source filter, keep True
[Username] = USERNAME()51. How would you organise content and permissions on Tableau Server or Cloud for a large sales organisation?
Use projects as the permission boundary, such as Sales Production, Sales Sandbox and Certified Data, and lock permissions at project level so authors cannot loosen them on single workbooks. Grant permissions to groups, not individuals, kept in sync with the identity provider. Match site roles to need: Creators for the few who build data sources, Explorers for analysts who edit, Viewers for everyone else. Reuse certified published data sources, schedule refreshes off-peak and remove stale content regularly. Row-level security belongs in the data source.
52. Explain table calculation addressing and partitioning with a percent of total example.
Fields the calculation moves along are addressing; all other dimensions are partitions where it restarts. With North sales 400 and 600 and South 300 and 700 for 2023 and 2024, Table (across) addresses Year, so each region sums to 100%: North 40% and 60%. Table (down) addresses Region: 2023 splits 57.1% and 42.9%. Table (across then down) covers the whole table: 20%, 30%, 15% and 35%. Prefer Specific Dimensions, so the result survives when someone swaps rows and columns.
Region 2023 2024
North 400 600
South 300 700
SUM([Sales]) / TOTAL(SUM([Sales]))
Table (across) -> addresses Year
Table (down) -> addresses Region
Table (across then down) -> addresses both53. How do you show only April to June while the running total still includes January to March?
A normal filter on month removes January to March before the table calculation runs, so the running total restarts: April to June show 150, 280 and 450. To show only those months but keep the year-to-date values 450, 580 and 750, filter on a table calculation instead, such as LOOKUP of the month with offset 0. It returns the month itself, but because it is a table calculation it is applied after the running total is computed, so it only hides marks. Both calculations must use the same Compute Using, and the filter must cover only the months you want.
Month Sales
Jan 100
Feb 120
Mar 80
Apr 150
May 130
Jun 170
[Running Sales] RUNNING_SUM(SUM([Sales]))
// Put this on Filters instead of the month field,
// same Compute Using as the running total
[Month Shown] LOOKUP(MIN([Order Date]), 0)54. How do you build a fair year-to-date versus last year comparison for a KPI tile?
Use a date parameter as the as-of date, so the comparison is fair and repeatable instead of depending on TODAY. YTD sums sales from 1 January of the parameter year up to that date; prior YTD sums the same span a year earlier, using DATEADD to shift the date. With the as-of date 15 March 2024, YTD is Rs 18,00,000 and prior YTD is Rs 16,00,000, growth 12.5%. Comparing all of 2023, Rs 28,00,000, with part of 2024 would wrongly show a fall. Default the parameter to the latest data date and let users change it.
Order Date Sales
2023-01-10 5,00,000
2023-02-20 7,00,000
2023-03-10 4,00,000
2023-03-25 3,00,000
2023-06-05 9,00,000
2024-01-15 6,50,000
2024-02-28 8,00,000
2024-03-12 3,50,000
2024-04-02 6,00,000
// [As Of Date] is a date parameter, here 2024-03-15
[YTD Sales]
SUM(IF YEAR([Order Date]) = YEAR([As Of Date])
AND [Order Date] <= [As Of Date]
THEN [Sales] END)
[Prior YTD Sales]
SUM(IF YEAR([Order Date]) = YEAR([As Of Date]) - 1
AND [Order Date] <= DATEADD('year', -1, [As Of Date])
THEN [Sales] END)55. A regional sales head in Bengaluru asks for a sales dashboard. How do you plan and build it?
Start from the questions: are we on target, where are we behind, and why. The top row holds KPI tiles for Sales, Profit, Profit Ratio and YTD growth against last year, driven by one as-of date parameter. Below sit a monthly trend of this year against last year, a territory map or bar chart that filters the rest through a filter action, and a top 10 products table with a Top N parameter. Use one colour for good and one for bad, a fixed size and a phone layout. Build on a certified data source with row-level security, and match totals with finance before launch.
56. When do you choose an LOD expression over a table calculation, and the other way round?
An LOD expression is computed in the query at the level you name, so it works on any layout, can feed filters and other calculations, and can become a dimension, such as a customer's first order month. A table calculation works only on the aggregated numbers already in the view, so it depends on the layout and Compute Using, but it is the natural tool for order-based logic: running totals, ranks, moving averages and previous-period comparisons. I use LOD when the answer needs data that is not in the view, and table calculations for sequences. Table calculations cannot go inside an LOD.
57. How do you build a waterfall chart of profit by sub-category?
Put Sub-Category on Columns and a running total of SUM(Profit) on Rows, computed Table (across). Change the mark type to Gantt Bar and put a field equal to negative SUM(Profit) on Size, so each bar hangs from the running total by its own profit and a loss rises instead. With profits of 300, 120, -150 and 60, the running totals are 300, 420, 270 and 330. Colour by whether profit is positive and turn on Analysis, Totals, Show Row Grand Totals to add the final bar. The usual bug is the wrong sign on the size field, which makes bars point the wrong way.
Sub-Category Profit
Phones 300
Chairs 120
Tables -150
Binders 60
Rows: RUNNING_SUM(SUM([Profit])) // Table (across)
Marks: Gantt Bar
Size: [Negative Profit]
[Negative Profit]
-SUM([Profit])58. How would you let users swap between a chart and a table in the same dashboard space?
In Tableau 2022.3 and later, use Dynamic Zone Visibility: create a parameter such as View Type with the values Chart and Table, make two boolean calculations from it, and set each sheet to Control visibility using value with one of them. Only the selected sheet shows, and the container gives it the full space. Users change the parameter through its control or through a parameter action on a small button-like sheet. In older versions the trick was sheet swapping: both sheets in one container, the unselected one filtered to no data, with its title hidden so it collapses.
59. Two teams publish certified data sources, Sales and Marketing Spend, and you need cost per order by month. What are your options?
In Tableau Desktop 2024.x you cannot join or relate two published data sources, so the quick option is blending: make Sales the primary source, link on month and channel, and bring in Marketing Spend as aggregated secondary values. Blending works per sheet at the view level, so the linking fields must be in the view, secondary fields are always aggregated, and an asterisk means the link is too coarse. For the long term, ask the owners for one combined published source, built in Prep or the warehouse, so the logic is shared and tested.
60. Your Tableau total for March is Rs 4.2 crore, but the finance report says Rs 4.5 crore. How do you find the gap?
Reconcile step by step. First scope: data source and extract filters, and when the extract was last refreshed. Then definitions: order date or invoice date, gross or net of returns and GST, calendar or fiscal month. Then joins: an inner join dropping orders that have no matching customer, or a fan-out adding rows; compare row counts with the source table. Then the view: context, Top N and measure filters, and table calculations. Finally compare a daily crosstab with the finance query to find the first day that differs, and drill into it with View Data.
Practice questions for November 2026
New every month3 questions from the Tableau mock test, the way they appear in it. A new set comes on the 1st of every month. Pick your answer, then open it.
-
What is the main difference between a live connection and an extract?
- A live connection queries the source on each interaction; an extract is a stored snapshot of the data
- A live connection copies all rows into memory at open; an extract sends a new query to the source each time
- A live connection cannot use any filters, while an extract cannot use calculated fields
- A live connection works only with Excel, while an extract works only with databases
Show the answer
Answer: A live connection queries the source on each interaction; an extract is a stored snapshot of the data. With a live connection every change to the view sends a query to the database, so results are current but speed depends on the source. An extract is a copy saved in Hyper that must be refreshed to pick up changes.
-
You put SUM(Sales) and SUM(Profit) on one axis using Measure Values. What is this called, and when does it fit?
- A combined field; it fits only when both measures are date fields
- A reference band; it fits when one of the measures is a target value
- A blended axis; it fits when the measures share units and have similar ranges
- A dual axis; it fits when the measures have very different units and value ranges
Show the answer
Answer: A blended axis; it fits when the measures share units and have similar ranges. A blended (shared) axis draws several measures on one scale using Measure Values, with Measure Names on Color. If the ranges differ a lot, the smaller measure is squashed, and a dual axis is the better choice.
-
A dashboard's FIXED customer-total calculation must respect the Region filter card but not the Category filter card. How?
- Add only the Region filter to context
- Make Category a data source filter
- Change the FIXED expression to EXCLUDE
- Add both of the filters to context
Show the answer
Answer: Add only the Region filter to context. FIXED sees context filters but not regular ones, so putting only Region in context gives exactly this behaviour. A data source filter would also reach FIXED, and EXCLUDE would follow both regular filters.
Ready to apply?
There are 955 open jobs asking for Tableau on CoreHRx right now. Create a free profile once and apply with it.