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

6 May 2026 7 min read

Last updated: 9 October 2026

Share:

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:

tableau
// 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:

python
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)
text
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.4

T1. 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?

LOD expressions (FIXED, INCLUDE, EXCLUDE), the order of operations and context filters, table calculations, extracts versus live connections, relationships, joins and blending, dimensions and measures, and dashboard performance.

What is the difference between FIXED and INCLUDE?

FIXED computes at exactly the dimensions you name, ignoring the view's dimensions and most filters. INCLUDE computes at the view's dimensions plus the ones you name, then aggregates back to the view.

Why does my FIXED calculation ignore my filter?

FIXED expressions are computed before dimension filters. Add the filter to context, or use a data source or extract filter, if it should apply first.

When should I use a table calculation instead of an LOD expression?

When the result depends on the marks in the view, such as running totals, ranks or differences from the previous period. Use LOD expressions when the result must be fixed at a level independent of the view.

Dashboarding and BI tools are part of the Data Analytics course.

Sources

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.

Explore course