What this quiz covers
This quiz focuses on Understanding Granularity, giving you a quick way to practice the rules, question types, and explanations that matter most for Tableau.
A published data source contains one row for each month, product, and region. It includes monthly sales but does not contain Order ID, Customer ID, or an order-level date.
A user wants a worksheet with one mark per customer per day. Which statement best describes the limitation?
Tableau Quiz
Practice Understanding Granularity in Tableau with focused quiz questions that help you check what you know, review explanations, and build confidence with test-style prompts.
This quiz focuses on Understanding Granularity, giving you a quick way to practice the rules, question types, and explanations that matter most for Tableau.
Try each quiz question before looking at the correct answer. Use the explanations to review missed ideas, then come back to similar questions until the pattern feels familiar.
A published data source contains one row for each month, product, and region. It includes monthly sales but does not contain Order ID, Customer ID, or an order-level date.
A user wants a worksheet with one mark per customer per day. Which statement best describes the limitation?
A worksheet has one mark per State. City is placed in the view as ATTR([City]). Most states display an asterisk instead of a city name. The data has no calculation errors.
What is the most accurate interpretation of the asterisk?
ATTR() in Tableau, think about what that function is actually doing: it returns the single value shared by all underlying rows in a mark, but if multiple different values exist, it returns an asterisk (*) as a signal that no single representative value can be chosen.
This is exactly what's happening in C. Each State mark aggregates many rows of data. Most states contain multiple cities, so when Tableau evaluates ATTR([City]), it finds more than one distinct city value within that mark and displays an asterisk — not an error, but a meaningful indicator that the level of detail in the view is too coarse to display a single city.
A is wrong because nulls aren't the culprit here. ATTR() returns an asterisk when values differ, not specifically because one is null. A single null among matching values would still produce a result; only disagreement across non-null values (or a mix) triggers the asterisk in this context.
B is wrong because City is a string dimension, not a measure. ATTR() is a dimension aggregation designed precisely for text fields — it's the appropriate function. Tableau isn't confused about the data type.
D is wrong because this scenario has nothing to do with geographic roles or spatial ambiguity. The asterisk comes from aggregation behavior, not from a conflict between geographic assignments.
Your study tip: memorize the rule — ATTR() = "all values the same? show it. values differ? show *." When you see an asterisk in a view using ATTR(), your first instinct should be level-of-detail mismatch, not nulls or errors.A worksheet has Category in the view and one mark per category. Segment is not currently used. A user is considering either placing Segment on Detail or placing Segment on Filters while keeping all segment values selected.
How do these two actions differ with respect to the worksheet's granularity?
A data source has two line-item records. The first has sales of 120 and quantity of 2; the second has sales of 180 and quantity of 6. The requirement is to calculate overall sales per unit, giving each unit equal weight rather than giving each line item equal weight.
Which calculation satisfies the requirement at the combined level of detail?
AVG([Sales] / [Quantity]), which calculates each line's unit value and weights both line items equally.SUM([Sales]) / SUM([Quantity]), which divides total sales by total units across the contributing records. (correct answer)SUM([Sales] / [Quantity]), which adds the line-level unit values before applying the worksheet dimensions.AVG([Sales]) / SUM([Quantity]), which averages line sales and then normalizes by the combined unit quantity.SUM([Sales]) / SUM([Quantity]) pools all sales and all units before dividing, so a line item with 6 units influences the result proportionally more than one with 2 units — which is precisely what "equal weight per unit" requires.
A is the classic trap. AVG([Sales] / [Quantity]) computes the unit value per line first — 120/2=60 and 180/6=30 — then averages those two results: (60+30)/2=45. This gives each line item equal weight, not each unit, producing a distorted answer.
C uses SUM([Sales] / [Quantity]), which adds the line-level unit values (60+30=90) — a meaningless total that doesn't represent price per unit at any scale.
D mixes aggregation levels illogically: averaging line-item sales ($150) then dividing by total quantity (8) yields 18.75, which has no coherent business interpretation.
The study tip: when a question asks for a rate across combined records, always sum the numerator and denominator separately before dividing — never average the pre-computed rates.Customer A purchased only in the East region, Customer B purchased in both East and West, and Customer C purchased only in the West. A worksheet places Region in the view and displays COUNTD([Customer ID]). Grand totals are enabled.
Which result should be expected, and what does it demonstrate about granularity?
COUNTD() with grand totals in Tableau, you need to think carefully about at what level of granularity the calculation is being performed — because Tableau recomputes aggregate functions independently at each level, not by simply summing what's already displayed.
Here's the setup: Customer A appears only in East, Customer B appears in both East and West, and Customer C appears only in West. When Region is in the view, Tableau evaluates COUNTD([Customer ID]) separately for each region. East contains Customers A and B → 2 distinct customers. West contains Customers B and C → 2 distinct customers. So both regional marks show 2. The grand total, however, doesn't add 2 + 2 = 4. Instead, Tableau recomputes COUNTD across the entire dataset, where all three customers exist exactly once → 3 distinct customers. This is answer A, and it perfectly demonstrates that aggregate calculations respect the granularity of the context they're evaluated in.
Answer B is wrong because grand totals do not blindly sum the visible mark values — that would be a SUM of the displayed numbers, not a COUNTD of the underlying data. Answer C is wrong because Tableau doesn't remove Customer B from either regional mark; Customer B legitimately appears in both East and West transactions, so both regions correctly count them. Answer D is wrong because Tableau doesn't pre-aggregate distinct customers before applying the dimension — the calculation always runs within the current view's partition.
A good rule of thumb: treat grand totals as a completely fresh query at a higher granularity. COUNTD at the total level asks "how many distinct values exist across everything?" — not "what do the subtotals add up to?"A customer table contains one annual target per customer. It is physically joined to an orders table containing many rows per customer. A regional worksheet uses SUM([Annual Target]), and customers with more orders contribute their target multiple times.
Which diagnosis and redesign most directly address the incorrect result?
SUM([Annual Target]) with AVG([Annual Target]) so each order row contributes an equal fraction of the customer's goal.SUM([Annual Target]). The result is mathematically wrong, not just imprecise. Answer A correctly diagnoses this as a join-induced duplication and prescribes the right fixes: use a Tableau relationship (which preserves each table's native granularity and handles aggregation correctly before combining results) or pre-aggregate the orders table to one row per customer before joining.
Answer B is tempting but wrong — switching to AVG would only produce an accurate result by coincidence if every customer had exactly the same number of orders. It papers over the structural problem rather than solving it.
Answer C moves in exactly the opposite direction you need. Adding more granular rows would increase duplication, making the inflation worse, not better.
Answer D misidentifies Region as the cause. The duplication exists at the data-source level regardless of which dimensions you place in the view; hiding Region doesn't fix the underlying fanout.
Study tip: Anytime you see a one-to-many join in Tableau and a measure that "lives" on the one side, immediately suspect fanout inflation — and reach for relationships or pre-aggregation as your fix.The data source is at line-item granularity. Order A has three line items, each carrying the order-level discount of 10%. Order B has one line item carrying the order-level discount of 30%. A worksheet displays AVG([Discount]) with no dimensions in the view.
Why does the worksheet display 15% rather than the average discount per order of 20%?
AVG() in Tableau with no dimensions in the view, ask yourself: what is the granularity of the underlying data? Tableau aggregates at the row level of the data source, not at some logical business level you might expect.
Here, the data source has four line-item rows — three rows for Order A (each with 10% discount) and one row for Order B (30% discount). When Tableau computes AVG([Discount]), it treats all four rows equally: 410%+10%+10%+30%=460%=15%. Because Order A appears three times at the source granularity, its discount is weighted three times. That's why C is correct — Order A's discount contributes three observations, not one.
The 20% figure you might intuitively expect comes from averaging per order: 210%+30%=20%. But Tableau has no way to know you want order-level averaging unless you bring Order ID into the view or use a LOD expression like {FIXED [Order ID] : AVG([Discount])}.
A is wrong because Tableau doesn't apply numerical weighting based on a value's size — all rows are treated equally regardless of their magnitude. B is wrong because Tableau does not silently introduce Order ID as an implicit dimension; without dimensions in the view, it aggregates across all rows. D is wrong because Tableau performs no rounding or integer conversion on discount fields before aggregation.
The key study tip: always identify the data source granularity before predicting what an aggregation returns. When rows repeat an attribute (like a discount), AVG() will weight that attribute by row count — not by the logical entity it belongs to.A data source contains orders dated January 2024, January 2025, and February 2025. A user places the discrete Month date part of Order Date in a view and sees only January and February headers.
Which change would separate the two January periods while retaining monthly granularity?
A line-item data source contains several rows per order, and no order crosses regions. A worksheet is currently at Region granularity. The requirement is to display the average order sales for each region, giving every order equal weight regardless of its number of line items.
Which calculation most directly establishes order-level granularity before computing the regional average?
{ FIXED [Region] : AVG([Sales]) }, which averages line-item sales within each region without first constructing per-order totals.AVG({ INCLUDE [Order ID] : SUM([Sales]) }), which first sums sales per order within each region, then averages those order totals at the Region level. (correct answer){ EXCLUDE [Region] : SUM([Sales]) }, which removes the Region partition and returns the same overall sales total to every regional mark.SUM([Sales]) / COUNT([Order ID]), which divides regional sales by the number of line-item rows, giving orders with more lines greater influence.AVG({ INCLUDE [Order ID] : SUM([Sales]) }), is the correct approach. The inner INCLUDE expression computes total sales per Order ID within the current view context (Region), producing one value per order. The outer AVG() then averages those per-order totals across each region. Every order contributes equally to the regional average, regardless of how many line items it contains — exactly what the requirement specifies.
Option A uses { FIXED [Region] : AVG([Sales]) }, which averages individual line-item sales values within each region. This never constructs an order-level subtotal, so orders with more rows are overrepresented — the core problem the question is asking you to solve.
Option C, { EXCLUDE [Region] : SUM([Sales]) }, removes the Region dimension from the partition, collapsing everything into a single grand total and returning that same number to every regional mark. This is a misuse of EXCLUDE and doesn't produce regional or order-level insight at all.
Option D, SUM([Sales]) / COUNT([Order ID]), counts Order ID occurrences — not distinct orders — so multi-line orders are counted multiple times in the denominator, skewing the result downward for orders with more line items.
Remember: when you need to "summarize, then re-aggregate," reach for a nested LOD. The inner LOD handles the first summarization; the outer aggregate handles the second.A worksheet contains four underlying records: Furniture–Consumer sales of 100, Furniture–Corporate sales of 150, Office Supplies–Consumer sales of 200, and Office Supplies–Consumer sales of 50. The view initially contains Category and SUM([Sales]), producing one mark per category.
What happens when Segment is added to Detail on the Marks card, assuming no filters or other dimensions are present?