Monday's CSV
Every Monday at 06:00 a marketing analyst drops a 210,000-row CSV on a network share, and you refresh a workbook that 14 people use for the weekly stand-up. Four columns matter: Event Date arrives as text in three formats ('2024-03-05', '03/05/2024', '5 Mar 2024'); Spend carries dollar signs and thousands separators and is empty on about 9% of rows; Channel has 14 distinct spellings of what should be 5 channels ('email', 'Email', 'EMAIL ', ' paid search', …); Campaign ID is blank on 30% of rows. In Tableau, Event Date and Spend both carry the Abc icon, Channel's top member is ' email' with a leading space, and the dashboard either takes six minutes to respond on a live connection or shows last week's numbers until somebody clicks refresh.
1. You have two hours and no control over the producer. Which problems do you fix upstream, which in the workbook, and which not at all?
Read the worked answer
Triage by ownership and by blast radius.
- Event Date - push upstream first. Three formats means the producer is emitting garbage; ask for ISO-8601. If that fails, know the cost: simply changing the data type to Date parses the formats Tableau recognises and turns the rest into nulls, silently burying rows under a blank date header. A defensive calculation that tests the string shape and applies
DATEPARSEper format works, but it is brittle and runs on 210k rows every refresh. A scheduled Prep flow is the sane middle ground. - Spend - fix in the workbook.
FLOAT(REPLACE(REPLACE([Spend],'$',''),',',''))gives you a real measure. Resist wrapping it inZN()at row level: zero-filling is fine inside an aggregation but corruptsAVGand any count-of-records logic. Handle nulls at the point of aggregation (ZN(SUM([Spend]))) and show "not reported" as a distinct state. - Channel - workbook, but be honest.
TRIM(UPPER([Channel]))kills the case and the leading space; it will not merge 'Paid Search' with 'paid-search'. Use a calculation plus a small mapping table. Aliases look easier but are workbook-scoped, invisible to the next author, and a brand-new spelling simply appears as a new member next Monday. - Campaign ID blanks - leave alone. 30% null is almost certainly organic traffic. Filtering it out removes 30% of Spend and someone will notice by 09:30.
2. What is the right deployment for the refresh problem, and what could still bite you on the server?
Read the worked answer
Six minutes is the live connection re-reading a flat file and re-querying for interactions; that cost is paid by all 14 users. Options:
- Extract + scheduled refresh. Refresh after 06:00 Monday, hide unused fields to shrink it, and accept bounded staleness. Give the dashboard a visible "data as of" stamp so nobody argues about it in the meeting.
- Stay live only if the freshness requirement is genuinely intra-day; then the file needs to be on storage the server can reach, which a network share often is not.
What bites you on Tableau Cloud/Server: an extract built from a local file must travel with the file - check that the external file is included when you publish, or the scheduled refresh fails server-side and the dashboard quietly keeps serving the previous extract. Embedded credentials for the file share must be valid for the service account, not your personal login. And confirm the refresh actually ran in the extract refresh history rather than assuming the schedule fired; a failed refresh leaves the old numbers in place with no visible error to viewers.
3. How would you prove the workbook is trustworthy after the fixes, using numbers only?
Read the worked answer
Build a one-screen validation sheet and keep it in the workbook:
COUNT([Event Date])and a count of null dates - both must reconcile to the 210,000 input rows; any null count is the rows your date parsing dropped.COUNTD([Channel])after cleaning: expect 5, plus an explicit "Unmapped" member so new spellings are visible instead of silent.SUM([Spend])against the producer's own total, andCOUNT([Spend])vs total rows to quantify the 9% nulls.- A row-level raw sample of five records beside the parsed versions of Date/Spend/Channel.
When a number moves, this sheet tells you whether the source changed or your cleaning did - which is the difference between a data problem and a workbook problem, and the only thing that ends the argument on Monday.