Tableau Interview Questions and Answers
Tableau interviews return to one topic more than any other: when each calculation happens. This guide answers the core questions on FIXED, INCLUDE and table calculations, with the Tableau formulas and their results reproduced on a year of real online orders: one filter, two answers, 100% or 2.57%.
GloryTecks Team
Training & Placement Faculty
Last updated: 9 October 2026
Tableau interview questions return again and again to one topic: when each part of a calculation happens. A FIXED expression, a table calculation and a filter can sit in the same view and still disagree, because Tableau applies them in a fixed order (Tableau: order of operations). This guide shows the Tableau formulas interviewers ask about and reproduces their results in SQL on a year of real orders from a UK online retailer (UCI: Online Retail), so each answer has a number. The reproduction follows Tableau's documented semantics; it is not a run of Tableau itself.
The Tableau calculated fields discussed below:
// T1: share of the total that ignores dimension filters
SUM([Sales]) / MIN({ FIXED : SUM([Sales]) })
// T2: each customer's first purchase date
{ FIXED [Customer ID] : MIN([Order Date]) }
// T3: order value, at the invoice level, averaged in the view
AVG({ INCLUDE [Invoice] : SUM([Sales]) })
// T4: percent difference from the previous month (table calculation)
(ZN(SUM([Sales])) - LOOKUP(ZN(SUM([Sales])), -1)) / ABS(LOOKUP(ZN(SUM([Sales])), -1))And their results, reproduced:
import duckdb
db = duckdb.connect()
db.execute("INSTALL excel; LOAD excel")
db.execute("""CREATE TABLE sales AS SELECT InvoiceNo AS invoice, CAST(CAST(CustomerID AS DOUBLE) AS INTEGER) AS customer,
Country AS country, CAST(Quantity AS INTEGER) * ROUND(CAST(UnitPrice AS DOUBLE), 2) AS amount,
CAST(TIMESTAMP '1899-12-30' + to_seconds(CAST(ROUND(CAST(InvoiceDate AS DOUBLE) * 86400) AS BIGINT)) AS DATE) AS day
FROM read_xlsx('Online Retail.xlsx', all_varchar = true)
WHERE CustomerID IS NOT NULL AND InvoiceNo NOT LIKE 'C%' AND CAST(Quantity AS INTEGER) > 0""") # UCI Online Retail
q = lambda sql: db.execute(sql).fetchall()
print(f"{q('SELECT COUNT(*) FROM sales')[0][0]:,} order lines, {q('SELECT COUNT(DISTINCT customer) FROM sales')[0][0]:,} customers")
print("\nT1 percent of total with a dimension filter Country = 'Germany'")
table_calc = q("SELECT SUM(amount) / SUM(SUM(amount)) OVER () FROM sales WHERE country = 'Germany'")[0][0] # filter first, then total
fixed = q("SELECT SUM(amount) / (SELECT SUM(amount) FROM sales) FROM sales WHERE country = 'Germany'")[0][0] # FIXED total ignores it
print(f" table calculation share: {table_calc:.1%} | FIXED-based share: {fixed:.2%}")
print("\nT2 FIXED per customer: first purchase month, then customers per cohort")
for row in q("""WITH firsts AS (SELECT customer, MIN(day) AS first_day FROM sales GROUP BY customer) -- {FIXED [Customer] : MIN([Date])}
SELECT strftime(first_day, '%Y-%m') AS cohort, COUNT(*) FROM firsts GROUP BY cohort ORDER BY cohort LIMIT 3"""):
print(" ", *row)
print("\nT3 INCLUDE: average order value per country, not average line value")
for row in q("""WITH orders AS (SELECT country, invoice, SUM(amount) AS order_value FROM sales GROUP BY country, invoice) -- {INCLUDE [Invoice] : SUM([Sales])}
SELECT o.country, ROUND(AVG(o.order_value), 2) AS avg_order, (SELECT ROUND(AVG(amount), 2) FROM sales s WHERE s.country = o.country) AS avg_line
FROM orders o WHERE o.country IN ('United Kingdom', 'Germany', 'France') GROUP BY o.country ORDER BY o.country"""):
print(" ", *row)
print("\nT4 table calculations: monthly sales and percent difference from the previous month")
for row in q("""SELECT strftime(day, '%Y-%m') AS month, ROUND(SUM(amount)) AS sales,
ROUND(100 * (SUM(amount) / LAG(SUM(amount)) OVER (ORDER BY strftime(day, '%Y-%m')) - 1), 1) AS pct_diff
FROM sales WHERE day >= '2011-09-01' GROUP BY month ORDER BY month"""):
print(" ", *row)397,924 order lines, 4,339 customers
T1 percent of total with a dimension filter Country = 'Germany'
table calculation share: 100.0% | FIXED-based share: 2.57%
T2 FIXED per customer: first purchase month, then customers per cohort
2010-12 885
2011-01 417
2011-02 380
T3 INCLUDE: average order value per country, not average line value
France 537.34 25.06
Germany 500.8 25.31
United Kingdom 438.97 20.63
T4 table calculations: monthly sales and percent difference from the previous month
2011-09 952838.0 None
2011-10 1039319.0 9.1
2011-11 1161817.0 11.8
2011-12 518193.0 -55.4T1. Why does a percent-of-total change when you add a filter?
Because of when it is computed. A table calculation such as percent of total is computed on what remains in the view after filters (Tableau: table calculations). With a dimension filter keeping only Germany, it showed 100%. A FIXED total is computed before dimension filters, so the same filter left Germany's share of all sales at 2.57%. Which is right depends on the question: "share of what is shown" or "share of everything". Interviewers want you to know which one you built, and to label the chart so readers know too.
The follow-up: to make a filter apply before FIXED, add it to context. FIXED expressions respect context, data source and extract filters, but ignore other view filters (Tableau: LOD expressions).
T2. How do you build customer cohorts in Tableau?
With FIXED at the customer level: { FIXED [Customer ID] : MIN([Order Date]) } gives each customer's first purchase date, whatever else is in the view. Grouping customers by that month gave 885 customers in the December 2010 cohort, 417 in January 2011 and 380 in February. The December figure also includes customers who bought before the data starts, which is worth saying when you present it, because a reader would otherwise read December as an unusually strong month for new customers.
T3. What does INCLUDE do?
It computes at a finer level than the view, then aggregates back up. Averaging sales per line gave about 21 to 25 per country; averaging per order, using INCLUDE at the invoice level, gave 438.97 for the United Kingdom, 500.80 for Germany and 537.34 for France. "Average order value" means the second, and getting the level wrong by one dimension changes the answer twentyfold.
T4. What are table calculations good for, and what is their trap?
Running totals, ranks, moving averages and differences from the previous period, all computed on the aggregated values in the view. Monthly sales rose 9.1% in October and 11.8% in November 2011, then "fell" 55.4% in December, but the data ends on 9 December. A table calculation compares whatever marks are in the view, including a partial month. Exclude incomplete periods or compare like for like before presenting a percent difference.
T5. And EXCLUDE?
EXCLUDE computes at the view's level of detail minus the named dimension. In a view by country and month, { EXCLUDE [Month] : SUM([Sales]) } returns each country's total across all months on every month's row, which makes "this month versus the country's total" a simple division. Together with FIXED and INCLUDE, it lets you compute at a level other than the one the view is drawn at, without reshaping the data.
T6. How do you speed up a slow dashboard?
Find what is slow first, with Tableau's performance recording, then reduce the work. Common causes are too many marks, many interactive filters each running its own query, complex calculations evaluated row by row on a live connection, and detailed data where an aggregate would do. Typical fixes are extracts with only the needed columns and rows, aggregated extracts, fewer and simpler filters, and moving heavy calculations into the data source. Say which fix matches which cause.
Other questions to expect
- Extract or live connection? Extracts are snapshots optimised for speed and can be refreshed on a schedule; live connections query the source every time and reflect the latest data. Choose by freshness needs and source load.
- Relationships, joins or blending? Relationships keep tables separate and join at the right level for each view, which avoids the row duplication a physical join can cause; blending combines aggregated data from different sources on a shared dimension.
- Dimensions and measures, discrete and continuous? Discrete fields create headers; continuous fields create axes. The colour of the pill tells you which.
How to answer Tableau questions
- Name the order of operations whenever filters and calculations interact.
- Say the level of detail of every number you show.
- Check for partial periods before comparing them.
Tool choice is compared in Power BI vs Tableau, and design in dashboard design principles and data visualisation best practices. For the full analyst round, see data analyst interview questions and answers.
What are the most common Tableau interview questions?
What is the difference between FIXED and INCLUDE?
Why does my FIXED calculation ignore my filter?
When should I use a table calculation instead of an LOD expression?
Dashboarding and BI tools are part of the Data Analytics course.
Sources
- Tableau's Order of Operations (Tableau Help) — Tableau
- Create Level of Detail Expressions in Tableau (Tableau Help) — Tableau
- Transform Values with Table Calculations (Tableau Help) — Tableau
- Online Retail dataset (UCI Machine Learning Repository) — UCI Machine Learning Repository
GloryTecks Team
Training & Placement Faculty
The GloryTecks faculty team mentors learners across Data Science, AI and Data Engineering, with a focus on real-time projects and placement readiness in Hyderabad.
Want to master Interview Questions?
Join GloryTecks’ expert-led Data Analytics training in Hyderabad with real-time projects and 100% placement support.
Related articles
SQL Interview Questions: Top 50 with Answers
Fifty SQL interview questions with answers checked on PostgreSQL, DuckDB and SQLite against one small practice schema: evaluation order, NULL logic, joins and fan-out, window functions, dates, and performance, including where the three engines disagree.
Python Interview Questions for Data Roles
The plain-Python coding tasks data-analyst and data-engineer interviews use, without pandas: counting, deduplicating, grouping, streaming large files, flattening JSON, joining, and the bugs interviewers plant. Each has a worked solution and the follow-up questions to expect.
Data Science Interview Questions and Answers 2026
A data science interview is several interviews in one: statistics, machine learning, coding, product sense and a take-home. This guide maps each round with model answers, then works a churn take-home on real telecom data, including the checks that separate a strong submission from a high score.