Builds Tableau dashboards that compute correct numbers at the right grain and stay fast - LOD expressions, filter-order pipeline, extract strategy, and mark-count control. Use when someone asks "why is my Tableau number different from SQL", "FIXED vs INCLUDE vs EXCLUDE", "my dashboard takes 30 seconds to load", "table calc or LOD", or is designing a workbook others will consume. Do NOT use for Power BI or DAX measures - use power-bi-dax instead; for narrative presentation of findings use data-story; for KPI selection and review cadence use kpi-scoreboard-and-cadence; for static table layout and formatting use data-table-design.
Click to play with sound.
---
name: Tableau Best Practices
description: Builds Tableau dashboards that compute correct numbers at the right grain and stay fast - LOD expressions, filter-order pipeline, extract strategy, and mark-count control. Use when someone asks "why is my Tableau number different from SQL", "FIXED vs INCLUDE vs EXCLUDE", "my dashboard takes 30 seconds to load", "table calc or LOD", or is designing a workbook others will consume. Do NOT use for Power BI or DAX measures - use power-bi-dax instead; for narrative presentation of findings use data-story; for KPI selection and review cadence use kpi-scoreboard-and-cadence; for static table layout and formatting use data-table-design.
---
# Tableau Best Practices
Tableau's two failure modes are wrong numbers and slow dashboards, and both come from the same blind spot: not knowing at what grain a number is computed and when each filter fires. A dashboard that shows a plausible-but-wrong average per customer costs more than one that errors, because nobody checks it.
## Operating procedure
### Step 1: gather inputs
Before building, establish:
- The one question the dashboard answers, and the headline metric that answers it. If stakeholders list five questions, that is five dashboards or a scope fight - have it now.
- The grain of the source data (one row = ?) and the grain of every metric requested. "Average sales" is undefined until someone says per-order, per-customer, or per-region; label any grain you inferred as a guess.
- Data size and freshness need. Live connection only when data must be minutes-fresh and the source is fast; otherwise a Hyper extract, refreshed on schedule.
- Target screen and device - fixed-size dashboards sized to the actual display render faster and break less than automatic sizing.
### Step 2: pin the grain of every number
Tableau aggregates measures to the dimensions in the view. The same SUM([Sales]) is a different number on a region chart than on a customer chart. For every metric, write down the grain it should have; when it differs from the view grain, that is an LOD expression:
- FIXED computes at a stated grain regardless of view dimensions and dimension filters (context filters still apply): `{ FIXED [Customer] : SUM([Sales]) }`… load the full skill through Skill Me